【问题标题】:New column in Pandas dataframe based on boolean conditionsPandas 数据框中基于布尔条件的新列
【发布时间】:2018-09-01 02:13:41
【问题描述】:

我想根据每个特定行中的其他值为填充了 True 或 False 的 Pandas 数据框创建一个新列。我解决此任务的方法是在数据框中的每一行中应用一个检查布尔条件的函数,并用 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: ("'>' not supported between 'str' and 'int'", 'occured at index 0')

感谢您的帮助。

【问题讨论】:

  • 你的函数没有像你想象的那样工作。它将字符串'Feed' 与整数10 进行比较(等等)。在这种情况下,不建议使用apply。请参阅下面的 jpp 解决方案。

标签: python pandas dataframe


【解决方案1】:

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

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

&(“和”)运算符按元素应用于布尔系列。可以链接任意数量的此类条件。


或者,对于您多次执行相同比较的特殊情况:

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

【讨论】:

  • 第一次使用 stackoverflow,感谢您向我展示了它的强大功能。你的建议很棒。
【解决方案2】:

在您当前的设置中,只需像这样重写您的函数:

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

【讨论】:

  • 技术上正确,但在这种情况下不需要使用 apply。请参阅@jpp 解决方案。我不是这里的反对者。
  • 是的,没错。但是,他应该知道他目前的解决方案出了什么问题。
  • Python 新手,感谢您指出我的错误,以便我学习。
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多