熊猫-带条件的分组

时间:2020-07-22 19:23:13

标签: python pandas pandas-groupby

我想根据给定的范围条件对我的熊猫数据框进行分组。 例如:

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。可以保持这种灵活性吗?

4 个答案:

答案 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
相关问题