计算csv文件中

时间:2017-02-13 22:55:58

标签: python csv pandas

我刚开始使用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行
print df[:15]

工作得很好。 但计数不起作用。我认为这是因为colum性的格式。它是字符串,因为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()

没用。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以编码工作,您需要做的是创建一个新的数据框来存储分组数据的for循环的结果。 请参阅Intro to Data Structures

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

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

数据

course,     year,            sex
300,        1998,            f
300,        1998,            f
300,        1998,            m
300,        1995,            m
500,        1995,            f
500,        1998,            m

给出

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

请参阅Group By: split-apply-combine