鉴于以下数据框:
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")
有没有办法将两个语句组合成一个语句?
答案 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