python - 如何在转换函数中包含两个 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_1
在val
列和列logic_2
上date
)应用于代码。请在下面找到逻辑
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
填充列1
logic_1
logic_2
解决方案
你有几件事要修复首先,在 中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
推荐阅读
- python - 如何删除行 pandas df
- vba - Word VBA 将长日期转换为短日期
- mongodb - Node.js 应用程序无法使用 Kubernetes 连接到 MongoDB Docker 容器
- c# - 如何使用 JsonSerializerSettings 和 UseSnakeCasePropertyNames
- python - 在 Python 中实现自定义 Str 或 Buffer
- java - 单击按钮会导致应用程序崩溃 Android Studio
- go - YAML 修改别名序列元素
- javascript - AJAX 语法错误:无效字符
- python - 计算pandas中pivot_table中的平均值和总和,按两个单独的所需col值排序
- python - 泡菜后属性错误