【问题标题】:Fast way to turn Pandas DataFrame into nested list of tuples将 Pandas DataFrame 转换为嵌套元组列表的快速方法
【发布时间】:2022-01-23 15:37:06
【问题描述】:

给定如下的 DataFrame:

 col_a col_b col_c

0   0   1   a
1   0   2   b
2   0   3   c
3   1   4   d
4   1   5   e
5   1   6   f
6   2   7   g
7   2   8   h
8   2   9   i

我正在寻找一种创建子列表列表的方法,其中每个子列表包含与 col_a 值相对应的 col_bcol_c 值的对元组。在这个例子中,所需的输出是:

[[(1, 'a'), (2, 'b'), (3, 'c')],
 [(4, 'd'), (5, 'e'), (6, 'f')],
 [(7, 'g'), (8, 'h'), (9, 'i')]]

即第一个子列表包含三个元组,其中col_a 等于0,依此类推。

我设法使用这样的 for 循环来做到这一点:

main_list = []
for i in df["col_a"].unique():
    small_df = df.loc[df["col_a"] == i]
    sublist = small_df.drop(columns=["col_a"]).to_records(index=False).tolist()
    main_list.append(sublist)

但是这个解决方案非常笨重,并且需要很长时间才能在大型 df 上执行。我想知道是否有更快的方法来做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是解决问题的一种方法:

    df['p'] = [*zip(df['col_b'], df['col_c'])]
    l = df.groupby('col_a')['p'].agg(list).tolist()
    

    print(l)
    
    [[(1, 'a'), (2, 'b'), (3, 'c')],
     [(4, 'd'), (5, 'e'), (6, 'f')],
     [(7, 'g'), (8, 'h'), (9, 'i')]]
    

    【讨论】:

      【解决方案2】:

      使用groupby:

      totuple = lambda x: [(l, r) for l, r in zip(x['col_b'], x['col_c'])]
      out = df.groupby('col_a')[['col_b', 'col_c']].apply(totuple).tolist()
      print(out)
      
      # Output
      [[(1, 'a'), (2, 'b'), (3, 'c')],
       [(4, 'd'), (5, 'e'), (6, 'f')],
       [(7, 'g'), (8, 'h'), (9, 'i')]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2019-05-27
        • 2020-09-29
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多