我有以下数据框
col1 col2 col3
a b c
d e f
g h i
我写下面的
df['col1'] = np.where((df['col2'].str.contains('b',case = False,regex=True,na=False)) &
(df['col3'].str.contains('c',case = False,regex=True,na=False)),'s', 'o')
我现在得到这个
col1 col2 col3
s b c
o e f
o h i
我现在想要执行以下操作,其中col1不等于s
df['col1'] = np.where((df['col1'] != 's') &
(df['col2'].str.contains('e',case = False,regex=True,na=False)) &
(df['col3'].str.contains('f',case = False,regex=True,na=False)),'z','x')
我想要以下
col1 col2 col3
s b c
z e f
x h i
但是我得到了这个
col1 col2 col3
x b c
z e f
x h i
我希望逻辑不要改变col1中的s
答案 0 :(得分:1)
可能还有其他有效的解决方案,您可以尝试使用以下col1
等于s
然后返回s
,否则将np.where
应用于其他条件:
df['col1'] = np.where((df['col1'] == 's'), 's',
np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) &
(df['col3'].str.contains('f',case = False,regex=True,na=False)),
'z','x')
)
print(df)
结果:
col1 col2 col3
0 s b c
1 z e f
2 x h i
还有where
的更多条件:
df['col1'] = np.where((df['col1'] == 's'), 's',
np.where((df['col1'] == 'z'), 'z',
np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) &
(df['col3'].str.contains('f',case = False,regex=True,na=False)),
'z','x')
)
)
print(df)
首先我们可以创建函数,然后应用于dataframe
:
def function(row):
if row['col1'] == 's':
return 's'
elif row['col1'] == 'z':
return 'z'
elif ('e' in row['col2'].lower()) and 'f' in row['col3'].lower():
return 'z'
else:
return 'x'
现在,将函数应用于dataframe:
df['col1'] = df.apply(function, axis=1)
print(df)
结果:
col1 col2 col3
0 s b c
1 z e f
2 x h i