如何在Pandas中通过GroupBy与Lambda创建含(stage, days)元组的列表
问题描述
我们有如下的Pandas DataFrame df:
| id | stage | days |
|---|---|---|
| a1 | A | 1 |
| a2 | A | 3 |
| a3 | A | 2 |
| a4 | A | 5 |
| a1 | B | 1 |
| a2 | B | 2 |
| a1 | C | 2 |
| a3 | D | 3 |
目前已经通过GroupBy结合lambda实现了按id分组聚合stage列为列表,代码如下:
df1 = df.groupby('id').apply(lambda x: list(x['stage'])).reset_index()
得到的输出结果是:
id 0 0 a1 [A, B, C] 1 a2 [A, B] 2 a3 [A, D] 3 a4 [A]
现在需要修改代码,让每个id分组对应的列表元素是(stage, days)形式的元组,该怎么实现?
解决方案
其实只需要修改lambda函数里的逻辑,把stage和days两列配对成元组再转成列表就可以了,最简洁的方式是用zip()函数来实现:
df1 = df.groupby('id').apply(lambda x: list(zip(x['stage'], x['days']))).reset_index()
如果你想更直观地逐行构建元组,也可以用apply按行处理:
df1 = df.groupby('id').apply(lambda x: x.apply(lambda row: (row['stage'], row['days']), axis=1).tolist()).reset_index()
运行修改后的代码后,你会得到预期的结果:
id 0 0 a1 [(A, 1), (B, 1), (C, 2)] 1 a2 [(A, 3), (B, 2)] 2 a3 [(A, 2), (D, 3)] 3 a4 [(A, 5)]
简单解释一下:zip(x['stage'], x['days'])会把每个分组里的stage和days对应位置的元素打包成元组,再用list()把这个zip对象转换成列表,完美满足你的需求~
内容的提问来源于stack exchange,提问作者Edamame
相关产品推荐
相关产品推荐

