pandas:apply:使用lambda创建元组列表

时间:2018-03-27 00:50:17

标签: python pandas lambda tuples

我有以下数据框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]]

我在这里错过了什么吗?谢谢!

2 个答案:

答案 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