繁体   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