Pandas数据框分组:仅对正数进行求和/计数

3

我有一个数据框(‘frame’),我想按国家和日期进行聚合:

aggregated=pd.DataFrame(frame.groupby(['Country','Date']).CaseID.count())

aggregated["Total duration"]=frame.groupby(['Country','Date']).Hours.sum()

aggregated["Mean duration"]=frame.groupby(['Country','Date']).Hours.mean()

我希望只针对'frame'中正数的'Hours'数字计算上述数据(总共持续时间,平均持续时间等)。如何实现?

谢谢!

样例"frame"

import pandas as pd
Line1 = {"Country": "USA", "Date":"01 jan", "Hours":4}
Line2 = {"Country": "USA", "Date":"01 jan", "Hours":3}
Line3 = {"Country": "USA", "Date":"01 jan", "Hours":-999}
Line4 = {"Country": "Japan", "Date":"01 jan", "Hours":3}
pd.DataFrame([Line1,Line2,Line3,Line4])

“frame”看起来像这样: 日期,国家,小时 2012年1月1日,美国,4 2012年1月1日,美国,3 2012年1月1日,美国,-999 2012年1月1日,日本,3“聚合”后的输出应该是这样的: 日期,国家,计数,正数计数,总持续时间,平均持续时间 2012年1月1日,美国,3,2,7,3.5 2012年1月1日,日本,1,1,3,3 - Alexis Eggermont
请提供一个数据框(dataframe),意思是提供一些有效的Python代码来重建它。 - alko
好的,让我尝试为此提供代码。 - Alexis Eggermont
1
如果 line4['hours'] = -1,你期望得到什么结果? - alko
2
一定要使用NaN来表示缺失值(而不是-999)。 - Andy Hayden
显示剩余4条评论
2个回答

9
怎样 -
frame[frame["Hours"] > 0].groupby(['Country','Date'])

远比使用lambda/apply更高效。对此点赞。 - undefined

9

下面这个方法不如上面那个优雅,但能处理一些角落案例。 df 代表原问题中的 frame

>>> df.groupby(['Country','Date']).agg(lambda x: x[x>0].mean())
                Hours
Country Date
Japan   01 jan    3.0
USA     01 jan    3.5
>>> df.ix[3, 'Hours'] = -1
>>> df.groupby(['Country','Date']).agg(lambda x: x[x>0].mean())
                Hours
Country Date
Japan   01 jan    NaN
USA     01 jan    3.5

更好的方法是使用 NaN 作为哨兵值,而不是 -999,然后根本不进行过滤,并使用 nanmean 或其他 nan 不敏感的统计函数,这些函数已经内部具有隐式且更快速地过滤功能。但我意识到您正在根据 OP 的问题接受数据。 - ely
如果您需要重复使用过滤器(例如sum、count等),那么在进行分组之前执行过滤操作的一个原因是它可能会更快(尽管可能不太清晰)。 - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接