计算csv fi中分组字符串的出现次数

2024-03-28 15:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始使用python就是因为这个问题。我读了Counting particular occurrences in python in csv file中的旧线程,但我无法进行计数。在

我的csv文件如下所示:

course     year of birth   sex
300        1998            w
300        1998            m
500        1995            w

我需要的是计算每门课程每年出生的男性和女性人数。在

我测试了导入csv文件的前15行

^{pr2}$

效果很好。 但计数不起作用。我想这是因为sex专栏的格式。它是字符串,因为f和m表示男女课程参与者。在

最后我想要一个这样的csv文件:

course     date of birth    sex    sum per sex  
300        1981             m      5  
300        1981             f      3  
300        1982             m      1  
300        1982             f      4  

我尝试了以下代码:

import pandas as pd
df = pd.read_csv("myFile.csv")

for name, group in df.groupby(["course", "dateOfBirth"]):
    print 'group name:', name
    print 'group rows:'
    print group
    print 'sum per sex:'
    print group["sex"].value_counts()
    raw_input()

我尝试过改变分组,但直到现在我还不太明白它是如何工作的。也许我想吃的面包对初学者来说太大了;o)

编辑1

我读了一些文档,让我的代码运行起来——至少每年都要计算性别和课程。在

因为我无法从Neo-X那里得到答案(非常感谢您的时间回答我!)为了工作,我必须努力工作:

# Result should be a csc file like this:
#
# course year    gender   sum
# 200    1930    m        2
# 200    1930    w        1
# ...
# 300    1989    m        2
# 300    1989    f        2
# 300    1990    m        3
# 300    1990    f        2
#

import pandas as pd
df = pd.read_csv("course_year_gender.csv")

# check the first 15 rows if data looks okay:
print "--------------------------------------------------------"
print "Show the first 10 rows to check if file is ok"
print "--------------------------------------------------------"
print df[:15]
print "--------------------------------------------------------"

# empty line
print '\n'
# then we can group by gender and year and do work on each group:
print "--------------------------------------------------------"
print "Grouped data"
print "--------------------------------------------------------"
for name, group in df.groupby(["course", "year"]):
    print "----------------------------"
    print 'group name:', name
    #print 'group rows:'
    #print group
    print 'Total per gender:'
    print group["gender"].value_counts()

它返回这个:

...
group name: (300, 2010)
Total per gender:
f    2
m    2
Name: gender, dtype: int64
----------------------------
group name: (300, 2011)
Total per gender:
m    3
f    1
Name: gender, dtype: int64
----------------------------
group name: (300, 2012)
Total per gender:
m    7
f    5
Name: gender, dtype: int64
...

有什么建议我可以得到一个类似csv表的输出?像这样的东西

print group["course", "year", "gender"].value_counts()

没用。在


Tags: csvnameindfgroupgenderyearfile
1条回答
网友
1楼 · 发布于 2024-03-28 15:22:52

如果代码有效,则需要创建一个新的dataframe来存储分组数据的for循环的结果。 见Intro to Data Structures。在

为了简化操作,您可能需要使用以下方法来替换for循环,然后将返回的series数据存储到新的dataframe中。在

df.groupby(['course', 'year', 'sex']).size()

数据

^{pr2}$

给予

course  year  sex          
300     1995              m    1
        1998              f    2
                          m    1
500     1995              f    1
        1998              m    1

Group By: split-apply-combine

相关问题 更多 >