假设我有一个像这样的数据框:
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
and a OR b OR c
,而不仅仅是a
, b
and c
?为了举例,假设我想通过以下方式聚合结果'sum'
。然后我会得到:
A
a 3
a OR b 10
a OR b OR c 21
我认为这实际上取决于您想要使用的功能。
我可以想到一个技巧DataFrame.expanding https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.expanding.html例如,如果你想计算sum.这个想法是,我们可以利用扩展,然后只考虑使用以下命令选择整个组的行Series.where https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.where.html
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
UPDATED
我们还可以使用DataFrame.groupby https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html + DataFrame.expanding https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.expanding.html
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)