熊猫将行分组为列表和总和

时间:2018-12-19 17:59:07

标签: python pandas pandas-groupby multi-index

我有一个包含以下数据的多索引熊猫数据框:

          F     M   
         0  5  10 30
x  y  a1  0  1  0  1
      a2  1  0  0  0
      a3  0  1  0  1
      a4  0  1  0  2
x1 y1 a1  0  1  1  4
      a2  0  1  0  1
      a3  1  1  0  1
      a4  2  1  1  2
x2 y2 a1  0  0  0  0
      a2  0  0  0  0

我想通过(A,B)对数据进行分组,并将列C与行的总和合并在一起。

必填输出:

              sex             F               M
              counts          0  5  10  30    0  5  10  30
     A  B  C
     x  y  [a1,a2,a3, a4]     1  3   3   1    0  3   0   4

     x1 y1 [a1, a2, a3, a4]   3  4   4   0    3  0   1   8

     ......

我尝试过df.groupby(['A', 'B']).sum(),但是它忽略了输出数据框中的列C。


要复制的代码

index = pd.MultiIndex(levels=[['x', 'x1', 'x2'], ['y', 'y1', 'y2'], ['a1', 'a2', 'a3', 'a4']],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1]])

columns = pd.MultiIndex(levels=[['F', 'M'], [0, 5, 10, 30]],
           labels=[[0, 0, 1, 1], [0, 1, 2, 3]])

data = np.array([
       [0, 1, 0, 1],
       [1, 0, 0, 0],
       [0, 1, 0, 1],
       [0, 1, 0, 2],
       [0, 1, 1, 4],
       [0, 1, 0, 1],
       [1, 1, 0, 1],
       [2, 1, 1, 2],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

df = pd.DataFrame(data, index=index, columns=columns)

1 个答案:

答案 0 :(得分:2)

使用groupbysum来聚合数字数据,并使用apply(tuple)来聚合索引级别。

g = df.reset_index(level=-1).groupby(level=[0, 1])
res = g.sum().set_index(g.level_2.apply(tuple), append=True)

print(res)
                          F     M   
                       0  5  10 30
      level_2                     
x  y  (a1, a2, a3, a4)  1  3  0  4
x1 y1 (a1, a2, a3, a4)  3  4  2  8
x2 y2 (a1, a2)          0  0  0  0

请注意,索引只能包含可哈希值,而列表则不可哈希,因此元组是下一个优点。