python - python:在groupby pandas中迭代,根据以前的值添加新列
问题描述
我的数据框是:
id beg end
client1 2021-10-19 16:01:01 2021-10-21 08:19:17
client1 2021-10-21 10:41:53 2021-10-24 07:53:57
client3 2021-10-21 09:00:00 2021-10-21 10:00:00
client3 2021-10-21 10:00:00 2021-10-22 14:00:00
client2 2021-10-21 10:00:00 2021-10-21 14:00:00
我想根据列的先前值添加列,id
如下所示。
如果客户端出现不止一次,那么我想在该客户端的第二次出现时创建新列...
col1
这需要前一个end
col2
取beg
这一行的当前值(在本例中,针对 client1 和 client3)。
...否则什么都不放col1
,col2
预期输出:
id beg end col1 col2
client1 2021-10-19 16:01:01 2021-10-21 08:19:17 - -
client1 2021-10-21 10:41:53 2021-10-24 07:53:57 2021-10-21 08:19:17. 2021-10-21 10:41:53
client3 2021-10-21 09:00:00 2021-10-21 10:00:00 -- --
client3 2021-10-21 10:00:00 2021-10-22 14:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00
client2 2021-10-21 10:00:00 2021-10-21 14:00:00 2021-10-21 10:00:00 2021-10-21 14:00:00
解决方案
让我们从简单的方法开始(只获取之前的值):
我们可以使用groupby
+ shift
:
df['col1'] = df.groupby('id')['end'].shift()
输出:
id beg end col1
0 client1 2021-10-19 16:01:01 2021-10-21 08:19:17 NaN
1 client1 2021-10-21 10:41:53 2021-10-24 07:53:57 2021-10-21 08:19:17
2 client3 2021-10-21 09:00:00 2021-10-21 10:00:00 NaN
3 client3 2021-10-21 10:00:00 2021-10-22 14:00:00 2021-10-21 10:00:00
4 client2 2021-10-21 10:00:00 2021-10-21 14:00:00 NaN
但是如果组只有一行,我们想要这个条件......所以我们可以where
在组上使用和条件应用掩码size
:
g = df.groupby('id')
m = g['beg'].transform('size').gt(1)
df['col1'] = g['end'].shift().where(m, df['beg'])
df['col2'] = df['beg'].where(df['col1'].notnull())
df['col2'] = df['col2'].where(m, df['end'])
输出:
id beg end col1 col2
0 client1 2021-10-19 16:01:01 2021-10-21 08:19:17 NaN NaN
1 client1 2021-10-21 10:41:53 2021-10-24 07:53:57 2021-10-21 08:19:17 2021-10-21 10:41:53
2 client3 2021-10-21 09:00:00 2021-10-21 10:00:00 NaN NaN
3 client3 2021-10-21 10:00:00 2021-10-22 14:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00
4 client2 2021-10-21 10:00:00 2021-10-21 14:00:00 2021-10-21 10:00:00 2021-10-21 14:00:00
推荐阅读
- sorting - 使用 group by 的奇怪结果
- c# - SqlDataReader 连接
- c - 使用 fgets 获取输入并使用递归反向输出答案
- sublimetext3 - 崇高的文字突然开始在我的片段中添加空格
- node.js - 将新键值添加到 Connection.query 结果
- java - IntelliJ IDEA Gradle 同步:将 Gradle 的 Java 主页设置为某些 JDK 时出现问题
- scala - 扩展 Ordering 以容纳类对象时出现 PriorityQueue 可变参数错误
- haskell - 堆栈构建失败,并显示“无法为 `Main' 加载接口,找不到与 `main' 匹配的单元 ID”
- c - 在c中使用带有变量的宏
- c# - 验证多租户 .Net Core Web API 应用程序的颁发者的适当位置