基于多个列条件创建新列If-Else

2024-10-01 22:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾试图研究类似的问题,但就我所搜索的而言,我找不到任何有帮助的东西

我有一份从数据库中提取的每日报告,但其中有一条信息正是需要交付的信息。下面是我提取的一个示例:

col1           col2
wrongstring    correct
correctstring  correct
correctstring  correct
NaN            correct
NaN            NaN

col2中的信息已经使用dict和replace进行了更正,并且NaN缺少数据库中的值,因此我需要将其替换为缺少值的正确字符串。今天,它是在Excel中用vlookup完成的,如果我和if希望在脚本中实现它,那么我们可以获得一些时间

我想做的是:

如果df['col1']=errorString,则新列将使用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

谢谢你的帮助。干杯


Tags: 方法in信息数据库dfifnancol2
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.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

我们可以做条件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

相关问题 更多 >

    热门问题