pandas 数据框:如何在列上进行过滤,然后构建其他列的计数和总和
pandas data frame: How to filter on on a column and afterwards build count and sum of other columns
这是问题所在:我有以下数据:
df = pandas.DataFrame({'A': [10, 10, 20, 20, 30, 20, 10, 20, 30, 30],
'B': [1001, 1002, 2002, 2003, 3001, 2003, 1002, 2003, 3005, 3005],
'C': numpy.random.randn(10),
'D': numpy.random.randn(10)})
应用此:
df.groupby('A').agg({'B': max, 'C': numpy.count_nonzero})
我得到:
C B
A
10 3 1002
20 4 2003
30 3 3005
但我只想要 C 的计数,当它是 B 的最大值的一部分(按 A 分组)时。我在较早的 post 中了解到,可以像这样进行分组 - 仍然没有计算 C:
df.groupby('A')['B'].max()
这给了我每个 A 的最大 B。
A
10 1002
20 2003
30 3005
Name: B, dtype: int64
我错过了获得此结果的最后一步:
A B C
10 1002 2 # 2, because there are 2 rows of B = 1002 with A = 10
20 2003 3
30 3005 2
在我的项目中,我事先不知道 B 的值,所以我无法预先设置过滤器。
这是一种方法:
>>> df.groupby('A').apply(lambda g: pandas.Series({"MaxB": g.B.max(), "NumMax": (g.B==g.B.max()).sum()}))
MaxB NumMax
A
10 1002 2
20 2003 3
30 3005 2
操作(g.B==g.B.max()).sum()
统计组中B列等于B的最大值的行数
这种方法会为每个组计算两次组最大值,但计算最大值是一个非常快的操作,因此这在实践中不会对性能造成太大影响。
这是问题所在:我有以下数据:
df = pandas.DataFrame({'A': [10, 10, 20, 20, 30, 20, 10, 20, 30, 30],
'B': [1001, 1002, 2002, 2003, 3001, 2003, 1002, 2003, 3005, 3005],
'C': numpy.random.randn(10),
'D': numpy.random.randn(10)})
应用此:
df.groupby('A').agg({'B': max, 'C': numpy.count_nonzero})
我得到:
C B
A
10 3 1002
20 4 2003
30 3 3005
但我只想要 C 的计数,当它是 B 的最大值的一部分(按 A 分组)时。我在较早的 post 中了解到,可以像这样进行分组 - 仍然没有计算 C:
df.groupby('A')['B'].max()
这给了我每个 A 的最大 B。
A
10 1002
20 2003
30 3005
Name: B, dtype: int64
我错过了获得此结果的最后一步:
A B C
10 1002 2 # 2, because there are 2 rows of B = 1002 with A = 10
20 2003 3
30 3005 2
在我的项目中,我事先不知道 B 的值,所以我无法预先设置过滤器。
这是一种方法:
>>> df.groupby('A').apply(lambda g: pandas.Series({"MaxB": g.B.max(), "NumMax": (g.B==g.B.max()).sum()}))
MaxB NumMax
A
10 1002 2
20 2003 3
30 3005 2
操作(g.B==g.B.max()).sum()
统计组中B列等于B的最大值的行数
这种方法会为每个组计算两次组最大值,但计算最大值是一个非常快的操作,因此这在实践中不会对性能造成太大影响。