基于多个列条件创建其他列

时间:2020-06-08 00:06:06

标签: python pandas if-statement

我试图研究类似的问题,但据我搜索,我找不到任何有帮助的东西。

我有一份日常报告,是从数据库中提取的,但是其中的一个信息正是需要提供的信息。这是我提取的示例:

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

感谢您的帮助。干杯。

2 个答案:

答案 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)

方法1: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

方法2:Series.maskSeries.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