基于布尔条件,在Pandas数据框中创建新列

12
我希望为Pandas数据框创建一个新列,根据每行的其他值填充True或False。 我解决此任务的方法是对数据框中的每一行应用检查布尔条件的函数,并使用True或False填充新列。 这是数据框:
l={'DayTime':['2018-03-01','2018-03-02','2018-03-03'],'Pressure':
[9,10.5,10.5], 'Feed':[9,10.5,11], 'Temp':[9,10.5,11]}

df1=pd.DataFrame(l)

这是我编写的函数:

def ops_on(row):
   return row[('Feed' > 10)
              & ('Pressure' > 10)
              & ('Temp' > 10)
             ]

函数ops_on用于创建新列['ops_on']:

df1['ops_on'] = df1.apply(ops_on, axis='columns')

很不幸,我收到了这个错误信息:

TypeError:(“'>'不支持'str'和'int'的实例之间的比较”,发生在索引0处)

感谢您的帮助。


你的函数并没有按照你想象中的那样工作。它将字符串“Feed”与整数10进行比较(等等)。在这种情况下,不建议使用apply。请参考jpp的解决方案。 - pault
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
19

你应该按列(向量化,高效)而不是按行(低效,Python循环)工作:

df1['ops_on'] = (df1['Feed'] > 10) & (df1['Pressure'] > 10) & (df1['Temp'] > 10)

&("and")运算符逐个应用于布尔序列的元素。可以链接任意数量的这种条件。


或者,针对需要多次执行相同比较的特殊情况:

df1['ops_on'] = df1[['Feed', 'Pressure', 'Temp']].gt(10).all(1)

2
第一次使用stackoverflow,感谢您展示了它的强大。您的建议非常好。 - TvdM

1
在您当前的设置中,只需像这样重新编写您的函数:
def ops_on(row):
    return (row['Feed'] > 10) & (row['Pressure'] > 10) & (row['Temp'] > 10)

1
从技术上讲是正确的,但在这种情况下你不需要使用apply。请参考@jpp的解决方案。我不是这里的投票者。 - Scott Boston
是的,没错。但是,他应该知道他当前的解决方案有什么问题。 - YOLO
1
刚接触Python,感谢您指出我的错误,让我能够学习。 - TvdM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,