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