我的问题是如何计算熊猫体内多个变量的频率。 我从这个数据框得到:
d1 = pd.DataFrame( {'StudentID': ["x1", "x10", "x2","x3", "x4", "x5", "x6", "x7", "x8", "x9"],
'StudentGender' : ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],
'ExamenYear': ['2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'],
'Exam': ['algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'],
'Participated': ['no','yes','yes','yes','no','yes','yes','yes','yes','yes'],
'Passed': ['no','yes','yes','yes','no','yes','yes','yes','no','yes']},
columns = ['StudentID', 'StudentGender', 'ExamenYear', 'Exam', 'Participated', 'Passed'])
结果如下
Participated OfWhichpassed
ExamenYear
2007 3 2
2008 4 3
2009 3 2
(1)我尝试的一种可能性是计算两个数据帧并绑定它们
t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
tx = pd.concat([t1, t2] , axis = 1)
Res1 = tx['yes']
(2)第二种可能性是使用聚合函数。
import collections
dg = d1.groupby('ExamenYear')
Res2 = dg.agg({'Participated': len,'Passed': lambda x : collections.Counter(x == 'yes')[True]})
Res2.columns = ['Participated', 'OfWhichpassed']
至少可以说,这两种方式都很怪异。 熊猫是如何做到这一点的?
p.S:我也尝试了值计数而不是集合。Counter但无法运行
供参考:几个月前,我向Rhere提出了类似的问题,plyr可能会有帮助
----更新----
用户DSM是对的。所需的表格结果中有一个错误。
(1)选项1的代码是
t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t3 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
Res1 = pd.DataFrame( {'All': t1,
'OfWhichParticipated': t2['yes'],
'OfWhichPassed': t3['yes']})
它将产生结果
All OfWhichParticipated OfWhichPassed
ExamenYear
2007 3 2 2
2008 4 3 3
2009 3 3 2
(2)对于选项2,由于用户herrfz,我找到了如何使用值计数的方法,代码将是
Res2 = d1.groupby('ExamenYear').agg({'StudentID': len,
'Participated': lambda x: x.value_counts()['yes'],
'Passed': lambda x: x.value_counts()['yes']})
Res2.columns = ['All', 'OfWgichParticipated', 'OfWhichPassed']
将产生与Res1相同的结果
我的问题仍然是:
使用选项2,是否可以使用相同的变量两次(用于另一个操作?)是否可以为结果变量传递自定义名称?
----新的更新----
我终于决定使用apply我知道它更灵活。
您可以使用pandascrosstab函数,该函数在默认情况下计算包含两个或多个变量的频率表。例如
如果还想查看每行和每列的小计,请使用
margins=True
选项。我最终决定使用apply。
我正在发布我的想法,希望它能对其他人有用。
根据我从韦斯的书《数据分析的Python》中了解到的情况
这是我想到的
当我运行它时:
我得到了正确的结果
这种方法还允许我将频率与其他统计数据结合起来
我希望其他人会觉得这个有用
这:
看起来不会比R解决方案更尴尬,伊姆霍。
相关问题 更多 >
编程相关推荐