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

Python 基于多个列条件创建新列If-Else,python,pandas,if-statement,Python,Pandas,If Statement,我曾试图研究类似的问题,但就我所搜索的而言,我找不到任何有帮助的东西 我有一份从数据库中提取的每日报告,但其中有一条信息正是需要交付的信息。下面是我提取的一个示例: col1 col2 wrongstring correct correctstring correct correctstring correct NaN correct NaN NaN col2中的信息已经使用dict和replace进行了更正,并且NaN

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

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

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
谢谢你的帮助。干杯。

我们可以做条件替换

我们可以做条件替换

方法1:np.select 对于多条件列,我们可以使用np.select:

方法2:Series.mask和Series.fillna: 方法1:np.select 对于多条件列,我们可以使用np.select:

方法2:Series.mask和Series.fillna:
谢谢@Erfan。我认为我倾向于过度思考一个解决方案,永远不会得到结果。在上一个文件中进行测试,它工作得很好。然而,将它添加到脚本中,不知何故我得到了一个错误:方法1-m3和默认值不起任何作用,新列中的单元格保持空白。方法2——它正常工作,但是在几千行之后,它就简单地开始跳过行而不填充所有行。我试着解决它,但总是出错。也许你可以提供一些可能导致它的线索。谢谢@ErfanThanks@Erfan。我认为我倾向于过度思考一个解决方案,永远不会得到结果。在上一个文件中进行测试,它工作得很好。然而,将它添加到脚本中,不知何故我得到了一个错误:方法1-m3和默认值不起任何作用,新列中的单元格保持空白。方法2——它正常工作,但是在几千行之后,它就简单地开始跳过行而不填充所有行。我试着解决它,但总是出错。也许你可以提供一些可能导致它的线索。谢谢@ErfanInteresting@YOBEN_S。我不知道我能像那样用两次fillna。感谢您的分享。我已经尝试将您的和@Erfan实现到获取数据的脚本中,但只起到了部分作用。如果脚本保存Excel,然后我再次阅读并应用解决方案,那么它将正常工作。但是,在脚本中使用它时,某些行不会被“屏蔽”或替换。该脚本只对数据库进行查询并创建DF。然后我应用这个答案,然后将其保存到Excel,但某些行不受影响。你知道为什么吗?谢谢你的邀请。我不知道我能像那样用两次菲娜。感谢您的分享。我已经尝试将您的和@Erfan实现到获取数据的脚本中,但只起到了部分作用。如果脚本保存Excel,然后我再次阅读并应用解决方案,那么它将正常工作。但是,在脚本中使用它时,某些行不会被“屏蔽”或替换。该脚本只对数据库进行查询并创建DF。然后我应用这个答案,然后将其保存到Excel,但某些行不受影响。你知道为什么吗?谢谢
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
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
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