基于列中字符串值的条件连接

时间:2018-01-03 18:24:22

标签: python string pandas

我目前拥有的python数据框包含两列:" EVENT"和#34; 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"中的值。柱。否则,请保留" EVENT"柱。

我已经在互联网上搜索了如何做到这一点但却无法找到任何特定于我想要完成的事情。

2 个答案:

答案 0 :(得分:3)

选项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

答案 1 :(得分:0)

这是一个没有掩码的 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