我想根据给定的范围条件对我的熊猫数据框进行分组。 例如:
Number, Amount
1, 5
2, 10
3, 11
4, 3
5, 5
6, 8
7, 9
8, 6
范围条件:
1至4(包括),命名为A:5 + 10 + 11 + 3 = 29
5及更高,命名为B:5 + 8 + 9 + 6 = 28
所需结果:
Number, Amount
A, 29
B, 28
编辑:感谢您的出色解决方案。 我希望能够根据需要添加更多的范围条件,因此也可以单独使用5-7和8。可以保持这种灵活性吗?
答案 0 :(得分:4)
您可以检查 <dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
的值,将其映射到Number
然后进行分组:
A,B
输出:
(df.Amount.groupby(df.Number.ge(5).map({True:'B',False:'A'}))
.sum()
.reset_index()
)
答案 1 :(得分:4)
还可以使用pd.cut
,如果您使用两个以上的标签和范围,则很有用:
df.groupby(pd.cut(df['Number'],
bins=[0,4,np.inf],
labels=['A', 'B']))['Amount'].sum().reset_index()
输出:
Number Amount
0 A 29
1 B 28
答案 2 :(得分:2)
与np.where
一起使用groupby
df.groupby(np.where(df.Number <= 4, 'A', 'B')).Amount.sum().reset_index()
Out[16]:
index Amount
0 A 29
1 B 28
如果您需要匹配的列名,只需链接rename_axis
df_final = (df.groupby(np.where(df.Number <=4, 'A', 'B')).Amount.sum()
.rename_axis('Number')
.reset_index())
Out[25]:
Number Amount
0 A 29
1 B 28
答案 3 :(得分:0)
您在这里:
import numpy as np
nos = df[(df.Number.between(1, 4)) | (df.Number >= 5)]
nos.groupby(np.where(nos.Number <= 4, 'A', 'B'))\
.Amount.sum().reset_index()\
.rename(columns={'index': 'Number'})
输出
Number Amount
0 A 29
1 B 28