Python 按自定义组分组
假设我有这样一个数据帧:Python 按自定义组分组,python,pandas,aggregate,pandas-groupby,Python,Pandas,Aggregate,Pandas Groupby,假设我有这样一个数据帧: 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或B和a或B或c,而不仅仅是a、B和c?在本例中,假设我想通过'sum'聚合结果。然后,我会得出以下结论:
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或B
和a或B或c
,而不仅仅是a
、B
和c
?在本例中,假设我想通过'sum'
聚合结果。然后,我会得出以下结论:
A
a 3
a OR b 10
a OR b OR c 21
我认为这真的取决于你想要使用的功能。 我可以想出一个技巧,例如,如果你想计算和
已更新 我们也可以使用+ 要获得预期的输出:
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
谢谢,这是一个很好的建议。然而,我对“典型的”
groupby
输出更感兴趣。我已经用一个示例输出更新了这个问题。
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
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