假设我有一个这样的数据框:
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
如何按B
列进行分组,使分组分别为a
,a OR b
和a OR b OR c
,而不仅仅是a
,{{1} }和b
?出于示例的原因,假设我想按c
汇总结果。然后我会得到:
'sum'
答案 0 :(得分:3)
我认为这实际上取决于您要使用的功能。
例如,如果您想计算 sum ,我可以想到一个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