我目前拥有的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"柱。
我已经在互联网上搜索了如何做到这一点但却无法找到任何特定于我想要完成的事情。
答案 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