【问题标题】:Efficient ways of assigning value based on conditional in Pandas?在 Pandas 中基于条件分配价值的有效方法?
【发布时间】:2021-01-29 19:54:57
【问题描述】:

目标是为EXPECTED T 列分配一个值。如果C2 B列中有EM,则赋值为C1 S + C2 B,否则为C2 B处的值的图像。

为了实现目标,提出以下代码

data = {'C1 S': ['AB','AB','CD','CD','CD'],
        'C2 B': ['EM','EM','EM','F','F'],
        'EXPECTED_OUTPUT': ['AB EM','EB EM', 'CD EM','F','F']}
df = pd.DataFrame(data)
df['EXPECTED T']=df['C1 S']+' '+ df['C2 B']
mask = df ['C2 B'].str.contains ( r'EM', na=True )
df.loc [~mask, 'EXPECTED T'] = df.loc [~mask, 'C2 B']

但是,我想知道是否有比上面的代码更多的 Pythonic 实现类似的结果?

【问题讨论】:

    标签: python pandas conditional-statements


    【解决方案1】:

    使用numpy.whereSeries.mask,这里也可以使用Series.str.cat

    mask = df['C2 B'].str.contains ( r'EM', na=True )
    df['EXPECTED T'] = np.where(mask, df['C1 S']+' '+ df['C2 B'], df['C2 B'])
    

    #alternative
    df['EXPECTED T'] = np.where(mask, df['C1 S'].str.cat( df['C2 B'], sep=' '), df['C2 B'])
    print (df)
      C1 S C2 B EXPECTED_OUTPUT EXPECTED T
    0   AB   EM           AB EM      AB EM
    1   AB   EM           EB EM      AB EM
    2   CD   EM           CD EM      CD EM
    3   CD    F               F          F
    4   CD    F               F          F
    

    或者:

    mask = df['C2 B'].str.contains ( r'EM', na=True )
    df['EXPECTED T'] = df['C2 B'].mask(mask, df['C1 S']+' '+ df['C2 B'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2021-08-02
      • 2022-01-10
      相关资源
      最近更新 更多