![](/img/trans.png)
[英]Pandas groupby with a custom function for a large dataset and a large number of groups
[英]Pandas groupby custom groups
假设我有一个这样的数据框:
df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6], 'B': ['a', 'a', 'b', 'b', 'c', 'c']})
print(df)
A B
0 1 a
1 2 a
2 3 b
3 4 b
4 5 c
5 6 c
如何按 col B
分组,使组为a
、 a OR b
和a OR b OR c
,而不仅仅是a
、 b
和c
? 为了这个例子,假设我想按'sum'
聚合结果。 然后我会得到:
A
a 3
a OR b 10
a OR b OR c 21
我认为这真的取决于您要使用的功能。 例如,如果您想计算总和,我可以想到DataFrame.expanding
的一个技巧。这个想法是我们可以利用扩展,然后只考虑使用Series.where
选择整个组的行
df.expanding().sum().where(df['B'].ne(df['B'].shift(-1)))
A
0 NaN
1 3.0
2 NaN
3 10.0
4 NaN
5 21.0
df.expanding().sum().where(df['B'].ne(df['B'].shift(-1))).loc[lambda x: x.A.notna()]
A
1 3.0
3 10.0
5 21.0
更新
我们也可以使用DataFrame.groupby
+ DataFrame.expanding
df.groupby('B').sum().expanding().sum()
要获得预期的输出:
new_df = (df.groupby('B').sum().expanding().sum()
.reset_index()
.assign(B = lambda x: x.B.add(' or ').cumsum()
.str.rstrip(' or '))
.set_index('B') )
print(new_df)
A
B
a 3.0
a or b 10.0
a or b or c 21.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.