我试图研究类似的问题,但据我搜索,我找不到任何有帮助的东西。
我有一份日常报告,是从数据库中提取的,但是其中的一个信息正是需要提供的信息。这是我提取的示例:
col1 col2
wrongstring correct
correctstring correct
correctstring correct
NaN correct
NaN NaN
col2中的信息已使用字典进行了替换并已得到纠正,并且NaN缺少数据库中的值,因此我需要使用正确的字符串替换该值以获取缺少的值。今天,它是使用vlookup在Excel中完成的,如果我想在脚本中实现它,那么我们可以花些时间。
我想做的是:
如果df ['col1'] =错误的字符串,则新列将使用df ['col2']值。
如果df ['col1']为NaN,则新列使用df ['col2']值。
如果两列均为NaN,则新列应使用newstring。
否则保留df ['col1']值。
到目前为止,我想出了一个带来错误的代码(我知道这是来自.isnull()部分,但是我找不到解决该问题的方法):
df['newcolumn'] = [x in df['col2'] if x=='wrongstring' else ('newstring' if ((df['col1'].isnull()) and (df['col2'].isnull())) else x in df['col1'])
for x in df['col1']]
如果有人可以帮助我解决这个问题,也许我使用的方法不正确,或者我错过了一些东西。结果应如下所示:
col1 col2 newcolumn
wrongstring correct correct
correctstring correct correctstring
correctstring correct correctstring
NaN correct correct
NaN NaN newstring
感谢您的帮助。干杯。
答案 0 :(得分:2)
我们可以做条件replace
df['newcolumns']=df.col1.replace({'wrongstring':np.nan}).fillna(df.col2).fillna('newstring')
df
col1 col2 newcolumns
0 wrongstring correct correct
1 correctstring correct correctstring
2 correctstring correct correctstring
3 NaN correct correct
4 NaN NaN newstring
答案 1 :(得分:2)
np.select
对于多条件列,我们可以使用np.select
:
m1 = df['col1'].eq('wrongstring')
m2 = df['col1'].eq('correctstring')
m3 = df['col1'].isna() & df['col2'].notna()
df['newcolumn'] = np.select([m1,m2,m3],
[df['col2'], df['col1'], df['col2']],
default='newstring')
col1 col2 newcolumns
0 wrongstring correct correct
1 correctstring correct correctstring
2 correctstring correct correctstring
3 NaN correct correct
4 NaN NaN newstring
Series.mask
和Series.fillna
:df['newcolumn'] = df['col1'].mask(
df['col1'].eq('wrongstring')
).fillna(df['col2']).fillna('newstring')
col1 col2 newcolumn
0 wrongstring correct correct
1 correctstring correct correctstring
2 correctstring correct correctstring
3 NaN correct correct
4 NaN NaN newstring