![](/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.