代码之家  ›  专栏  ›  技术社区  ›  Edamame

熊猫:应用:使用lambda创建元组列表

  •  0
  • Edamame  · 技术社区  · 7 年前

    我有以下数据框 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 对象我通过聚合 stage 每个id的列。代码工作正常。

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

    然而,这个输出只给了我第一个 (阶段,天) 它看起来不像一个元组:

    a1  [[A], [1]]
    a2  [[A], [3]]
    a3  [[A], [2]]
    a4  [[A], [5]]
    

    我错过什么了吗?谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   YOLO    7 年前

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

    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)]
    
        2
  •  1
  •   BENY    7 年前

    来自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