簡體   English   中英

Pandas 根據 groupby 的值更新列值,如果有多個 if else

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM