pandas:apply:使用lambda创建tup列表

2024-05-06 12:17:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧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列创建了一个列表。在

^{pr2}$

输出如下:

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]]

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


Tags: 数据lambdaida2pandasdf列表a1
2条回答

数据来自Manish,创建元组列外的apply应该更快

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

这里有一个最小的例子。我想你想要这样的东西:

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)]

相关问题 更多 >