首页 > 解决方案 > 如何在转换函数中包含两个 lambda 操作?

问题描述

我有一个如下所示的数据框

df = pd.DataFrame({
'date' :['2173-04-03 12:35:00','2173-04-03 17:00:00','2173-04-03 20:00:00','2173-04-04 11:00:00','2173-04-04 12:00:00','2173-04-04 11:30:00','2173-04-04 16:00:00','2173-04-04 22:00:00','2173-04-05 04:00:00'],
'subject_id':[1,1,1,1,1,1,1,1,1],
'val' :[5,5,5,10,10,5,5,8,8]
 })

我想将几个逻辑(logic_1val列和列logic_2date)应用于代码。请在下面找到逻辑

logic_1 = lambda x: (x.shift(2).ge(x.shift(1))) & (x.ge(x.shift(2).add(3))) & (x.eq(x.shift(-1)))
logic_2 = lambda y: (y.shift(1).ge(1)) & (y.shift(2).ge(2)) & (y.shift(-1).ge(1)) 

感谢 SO 用户帮助我处理逻辑

这是我在下面尝试的

   df['label'] = ''
   df['date'] = pd.to_datetime(df['date'])
   df['tdiff'] = df['date'].shift(-1) - df['date']
   df['tdiff'] = df['tdiff'].dt.total_seconds()/3600
   df['lo_1'] = df.groupby('subject_id')['val'].transform(logic_1).map({True:'1',False:''})
   df['lo_2'] = df.groupby('subject_id')['tdiff'].transform(logic_2).map({True:'1',False:''}) 

我怎样才能使两者都成为一个逻辑语句的logic_1一部分logic_2?甚至可能吗?我也可能有两个以上的逻辑。不是为每个逻辑写一行,而是可以将所有逻辑耦合在一起在一个逻辑语句中。

我希望我的输出在两者都满意时label填充列1logic_1logic_2

在此处输入图像描述

标签: pythonpython-3.xpandasdataframepandas-groupby

解决方案


你有几件事要修复首先,在 中logic_2,你有lambda x但使用y,所以,你必须改变它,如下所示

logic_2 = lambda y: (y.shift(1).ge(1)) & (y.shift(2).ge(2)) & (y.shift(-1).ge(1))

然后您可以将逻辑一起使用,如下所示'无需创建空白列label。您可以如下直接创建“标签”列。

df['label'] = ((df.groupby('subject_id')['val'].transform(logic_1))
           & (df.groupby('subject_id')['tdiff'].transform(logic_2))).map({True:'0',False:'1'})

注意:您的逻辑会产生所有False值。所以,如果False映射到 1,你会得到 1,而不是True


推荐阅读