我有以下数据框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
我在Pandas GroupBy
对象上应用了lambda函数。我通过聚合每个ID的stage
列来创建列表。代码工作正常。
df1 = df.groupby('id').apply(lambda x: list(x['stage'])).reset_index()
df1
输出如下:
a1 [A, B, C]
a2 [A, B]
a3 [A, D]
a4 [A]
现在我想为每个id
组创建一个元组列表。该问题是(stage, days)
。我修改了上面的代码如下:
df2 = df.groupby('id').apply(lambda x:list((x['stage'],x['days']))).reset_index()
df2
我希望df2
像:
a1 [(A, 1), (B, 1), (C, 2)]
a2 [(A, 3), (B, 2)]
a3 [(A, 2), (D, 3)]
a4 [(A, 5)]
但是,这个输出只给出了每个id的第一个(stage, days)
,它看起来不像元组:
a1 [[A], [1]]
a2 [[A], [3]]
a3 [[A], [2]]
a4 [[A], [5]]
我在这里错过了什么吗?谢谢!
答案 0 :(得分:2)
这是一个最小的例子。我想你想要这样的东西:
df1 = pd.DataFrame({'A1':['a','b','c','a','b'],'B':[3,5,7,8,9], 'C':[10,20,30,40,50]})
df1.groupby('A1').apply(lambda df: list(zip(df['B'],df['C'])))
A1
a [(3, 10), (8, 40)]
b [(5, 20), (9, 50)]
c [(7, 30)]
答案 1 :(得分:1)
来自Manish的数据,创建元组列外侧应用应该更快
df1['New']=list(zip(df1.B,df1.C))
df1
Out[1132]:
A1 B C New
0 a 3 10 (3, 10)
1 b 5 20 (5, 20)
2 c 7 30 (7, 30)
3 a 8 40 (8, 40)
4 b 9 50 (9, 50)
df1.groupby('A1').New.apply(list)
Out[1133]:
A1
a [(3, 10), (8, 40)]
b [(5, 20), (9, 50)]
c [(7, 30)]
Name: New, dtype: object