熊猫分类汇总,整个组的筛选

时间:2020-03-13 14:08:35

标签: python pandas dataframe filter group-by

鉴于以下数据框:

import pandas as pd
import numpy as np
np.random.seed(seed=1)
size=20
df = pd.DataFrame({"group":np.random.choice(["A","B","C"], size),
                   "exclude":np.random.choice(["Yes","No"], size),
                   "value":np.random.randint(0,5,size=20)}).sort_values(["group","value","exclude"])

对于每个组,我需要有一个列,其中的组子存储除外特定行。我正在使用以下命令进行操作:

df["group_sum"] = df[(df.exclude=="No")].groupby("group")["value"].transform("sum")

不幸的是,对于排除的记录,该列为空。要填充它,我正在执行以下操作:

df["group_sum"] = df.groupby("group")["group_sum"].transform("max")

有没有办法将两个语句组合成一个语句?

2 个答案:

答案 0 :(得分:1)

您可以使用where保留未选中的行,但将其设置为NaN值:

df["group_sum"] = df.where(df.exclude== 'No').groupby("group")["value"].transform(
                    "sum").groupby(df.group).transform("max")

它给出:

   group exclude  value  group_sum
2      A      No      0       12.0
6      A      No      0       12.0
10     A      No      0       12.0
5      A     Yes      0       12.0
1      A     Yes      1       12.0
8      A      No      2       12.0
14     A      No      3       12.0
18     A      No      3       12.0
19     A      No      4       12.0
16     B      No      0        4.0
9      B      No      1        4.0
0      B     Yes      1        4.0
4      B     Yes      1        4.0
12     B     Yes      1        4.0
7      B      No      3        4.0
3      B     Yes      4        4.0
17     C      No      1        5.0
13     C     Yes      1        5.0
11     C     Yes      3        5.0
15     C      No      4        5.0

答案 1 :(得分:1)

您可以使用Series.map<select>映射到group的结果:

groupby