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

如何在熊猫中使用多索引聚合成列表?

  •  2
  • giser_yugang  · 技术社区  · 7 年前

    我有一个这样的数据框架:

        class1  class2  values  values2
    0        1       0       1        5
    1        1       1       2        8
    2        1       0       3        3
    3        2       0       5        6
    4        2       0       2        5
    5        2       1       4        2
    6        2       1       2        3
    7        2       1       3        1
    8        3       0       1        3
    9        3       0       3        3
    10       3       1       4        2
    11       3       1       2        4
    

    我希望根据 class1 class2 ,然后聚合 value value2 进入列表。所以我想得到 结果 应该这样:

       class1  class2     values    values2
    0       1       0     [1, 3]     [5, 3]
    1       1       1        [2]        [8]
    2       2       0     [5, 2]     [6, 5]
    3       2       1  [4, 2, 3]  [2, 3, 1]
    4       3       0     [1, 3]     [3, 3]
    5       3       1     [4, 2]     [2, 4]
    

    我试过这样做:

    df.groupby(['class1']).agg(lambda x: x.tolist()).reset_index()
    

    没问题。但我尝试了多重索引:

    df.groupby(['class1','class2']).agg(lambda x: x.tolist()).reset_index()
    

    显示错误:

    值错误:函数不减少

    我也试过这样做:

    df.groupby(['class1', 'class2'])['values'].apply(lambda x: x.tolist()).reset_index()
    

    此方法只能单独处理 价值 Value2 .

    有人能帮我一个更好的方法吗?提前谢谢

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

    你可以和 tuple 然后转换为 list 具有 applymap

    df.groupby(['class1', 'class2']).agg(tuple).applymap(list).reset_index()
    
       class1  class2     values    values2
    0       1       0     [1, 3]     [5, 3]
    1       1       1        [2]        [8]
    2       2       0     [5, 2]     [6, 5]
    3       2       1  [4, 2, 3]  [2, 3, 1]
    4       3       0     [1, 3]     [3, 3]
    5       3       1     [4, 2]     [2, 4]