![](/img/trans.png)
[英]Pandas groupby the same column multiple times based on different column values
[英]Pandas update column value based on values of groupby having multiple if else
我有一个 pandas 数据框,其中 3 列 X、Y 和 Z 用于分组。 我想根据代码中显示的条件为每个组更新 B 列(或将其存储在单独的列中)。 但我得到的只是最终结果为空。 我不确定我做错了什么
下面是表格示例(我没有记录所有案例,但我将它们包含在代码中):
group=df.groupby(['X','Y','Z'])
for a,b in group:
if ((b.colA==2).all()):
df['colB']=b.colB.max()
elif (((b.colA>2).all()) and (b.colB.max() >=2)):
df['colB']=b.colB.max()
elif (((b.ColC.str.isdigit()).all()) and ((b.ColC.str.len()==2).all())):
df['colB']=b.ColC.str[0].max()
elif (((b.ColC.str.isdigit()).all()) and ((b.ColC.str.len()>2).all())):
df['ColB']=b.ColC.str[:-2].max()
elif ((b.ColC.str[0].str.isdigit().all()) and (b.ColC.str.contains('[A-Z]').all()) and
(b.ColC.str[-1].str.isalpha().all())):
df['colB']=b.ColC.str[:-1].astype(float).max()
elif (b.ColC.str[0].str.isalpha().all() and b.ColC.str.contains('[0-9]').all()):
df['ColB']=len(set(" ".join(re.findall("[A-Z]+", str(b.ColC)))))
else:
df['colB']=np.nan
您的代码中的主要缺陷是您在整个colB列中设置了一些值,而它应该只在当前组的行中设置。
要以正确的方式完成任务,请定义要应用于每个组的 function:
def myFun(b):
if (b.colA == 2).all():
rv = b.colB.max()
elif (b.colA > 2).all() and (b.colB.max() >= 2):
rv = b.colB.max()
elif (b.colC.str.isdigit()).all() and (b.colC.str.len() == 2).all():
rv = b.colC.str[0].max()
elif b.colC.str.isdigit().all() and (b.colC.str.len() > 2).all():
rv = b.colC.str[:-2].max()
elif b.colC.str[0].str.isdigit().all() and b.colC.str[-1].str.isalpha().all():
rv = b.colC.str[:-1].astype(int).max()
elif b.colC.str[1].str.isalpha().all() and b.colC.str.contains('[0-9]').all():
rv = len(set("".join(b.colC.str.extract("([A-Z]+)")[0])))
else:
rv = np.nan
return pd.Series(rv, index=b.index)
另一个缺陷是您的数据。 最后一组('J'、'K'、'L')将由第一个if路径处理。 为了被第五条路径处理,我在这个组的colA中放了0 ,这样source DataFrame包含:
X Y Z colA colB colC
0 A B C 2 3 NaN
1 A B C 2 1 NaN
2 D E F 3 4 NaN
3 D E F 3 1 NaN
4 D E F 3 2 NaN
5 G H I 3 0 35
6 G H I 3 0 63
7 G H I 3 0 78
8 J K L 0 0 2H
9 J K L 0 0 5B
并填充结果列,运行:
df['Result'] = df.groupby(['X','Y','Z'], group_keys=False).apply(myFun)
结果是:
X Y Z colA colB colC Result
0 A B C 2 3 NaN 3
1 A B C 2 1 NaN 3
2 D E F 3 4 NaN 4
3 D E F 3 1 NaN 4
4 D E F 3 2 NaN 4
5 G H I 3 0 35 7
6 G H I 3 0 63 7
7 G H I 3 0 78 7
8 J K L 0 0 2H 5
9 J K L 0 0 5B 5
或者,要将结果放在colB中,请更改上述代码中的 output 列名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.