【问题标题】:Conditional Concatenation Based on String Value in Column基于列中字符串值的条件连接
【发布时间】:2018-06-13 11:08:05
【问题描述】:

我目前拥有的 python 数据框包含两列:“EVENT”和“NAME”。

EVENT   NAME
A       DEN
B       HAU
C       TOT
D       ABC
E       DEN

我想实现逻辑,让我的 EVENT 列如下:

EVENT
A_DEN
B
C
D
E_DEN

我想实现逻辑,如果“NAME”列包含 DEN 值,然后将其连接到“EVENT”列中的值。否则,将值保留在“事件”列中。

我在互联网上搜索了如何执行此操作,但找不到任何特定于我要完成的任务的内容。

【问题讨论】:

    标签: python string pandas


    【解决方案1】:

    这是一个不带面具的loc 替代方案。

    df.loc[df['NAME'] == 'DEN', 'EVENT'] = df['EVENT'] + "_" + df['NAME']
    
    df
    
       EVENT NAME
    0  A_DEN  DEN
    1      B  HAU
    2      C  TOT
    3      D  ABC
    4  E_DEN  DEN
    

    附加条件可以很方便的添加如下:

    df.loc[(df['NAME'] == 'DEN') | (df['NAME'] == 'HAU'), 'EVENT'] = df['EVENT'] + "_" + df['NAME']
    
    df
    
       EVENT NAME
    0  A_DEN  DEN
    1  B_HAU  HAU
    2      C  TOT
    3      D  ABC
    4  E_DEN  DEN
    

    【讨论】:

      【解决方案2】:

      选项 1
      您可以使用 str.contains/eq 执行“包含”检查,并使用 np.where 有条件地构建您的结果 -

      df.EVENT = np.where(df.NAME.str.contains('DEN'), df.EVENT + '_' + df.NAME, df.EVENT)
      

      或者,

      df.EVENT = np.where(df.NAME.eq('DEN'), df.EVENT + '_' + df.NAME, df.EVENT)
      

      df
      
         EVENT NAME
      0  A_DEN  DEN
      1      B  HAU
      2      C  TOT
      3      D  ABC
      4  E_DEN  DEN
      

      别忘了import numpy as np


      选项 2
      另一种方法是使用pd.Series.mask/pd.Series.where -

      df.EVENT = df.EVENT.mask(df.NAME.str.contains('DEN'), df.EVENT + '_' + df.NAME)
      

      或者,

      df.EVENT = df.EVENT.where(~df.NAME.str.contains('DEN'), df.EVENT + '_' + df.NAME)
      

      df
      
         EVENT NAME
      0  A_DEN  DEN
      1      B  HAU
      2      C  TOT
      3      D  ABC
      4  E_DEN  DEN
      

      选项 3
      另一种选择是使用基于 loc 的带有掩码的索引 -

      m = df.NAME.str.contains('DEN')
      df.loc[m, 'EVENT'] += ('_' + df.loc[m, 'NAME'])
      
      df
         EVENT NAME
      0  A_DEN  DEN
      1      B  HAU
      2      C  TOT
      3      D  ABC
      4  E_DEN  DEN
      

      【讨论】:

      • 我只是想用 np.where 发布一个 :)
      • @Vaishali np.where 通常是许多 pandas 问题的生计……也很容易实现,是我最喜欢的 numpy 函数之一 :-)
      • @cᴏʟᴅsᴘᴇᴇᴅ 使用 pd.np.where 是否安全?还是导入 np 和 np.where 会更有未来感?
      • @AntonvBR 我认为 np.where 会更安全,我使用 pd.np 所以 op 不需要明确地 import numpy as np。将编辑。
      • 成功了!我删除了我添加的额外括号...非常感谢您的详细回复!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2018-12-08
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多