通过multiindex重塑数据帧

时间:2017-03-27 16:56:55

标签: python list python-3.x pandas group-by

我创建了这个示例数据

pd.DataFrame.from_items([(0,['a1', 'a1', 'a2', 'a2']), (1,['b1', 'b1', 'b2', 'b2']), (2,['m', 'n', 'o', 'p'])])
    0   1  2
0  a1  b1  m
1  a1  b1  n
2  a2  b2  o
3  a2  b2  p

我想减少'该数据框具有列' 0'中唯一值的索引。然后作为一列返回列' 2'中的值数组。 e.g。

       '2'
Index 
a1    [m,n]
a2    [o,p]

我需要将它作为数据帧,因为我想将结果数据帧连接到另一个数据帧。他们两个都是公平的。大(18十亿行)。 我尝试使用堆栈,但我无法弄清楚如何做到这一点。我尝试使用数据透视表,但随后是col' 2'在标题中,而不是用作值。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以使用groupbyapply,最后转换为Series to_frame

print (df.groupby(0)[2].apply(list))
0
a1    [m, n]
a2    [o, p]
Name: 2, dtype: object

print (df.groupby(0)[2].apply(list).to_frame())
         2
0         
a1  [m, n]
a2  [o, p]

另一种解决方案:

print (df.groupby(0)[2].apply(lambda x: x.tolist()).to_frame())
         2
0         
a1  [m, n]
a2  [o, p]

如果需要输出unique值:

df = pd.DataFrame.from_items([(0,['a1', 'a1', 'a1', 'a2']), 
                              (1,['b1', 'b1', 'b2', 'b2']),
                              (2,['m', 'n', 'm', 'p'])])
print (df)
    0   1  2
0  a1  b1  m
1  a1  b1  n
2  a1  b2  m
3  a2  b2  p

print (df.groupby(0)[2].apply(list).to_frame())
            2
0            
a1  [m, n, m]
a2        [p]

print (df.groupby(0)[2].unique().to_frame())
         2
0         
a1  [m, n]
a2     [p]