用长multiindex创建大数据透视表

时间:2018-09-05 12:32:16

标签: python pandas pivot-table

我有一个要尝试旋转的形状为(4573,64)的数据框df。最后一列是一个“ id”,具有两个可能的字符串值“ old”和“ new”。我想将前63列设置为索引,然后将“ id”列放在顶部,其值是每个索引行的“旧”或“新”计数。 我已经从要用作索引的列标签中创建了一个列表对象,命名为cols。

我尝试了以下操作:

df.pivot(index=cols, columns='id')['id']

这将导致错误:“所有数组的长度必须相同” 还尝试了以下方法,看看我能否获得总和,但也没有运气:

pd.pivot_table(df,index=cols,values=['id'],aggfunc=np.sum)

任何同志都非常感激

2 个答案:

答案 0 :(得分:1)

我在线找到了一个讨论pandas 0.23.0中可能存在的错误的线程,其中pandas.pivot_table()不接受多索引,只要它包含NaN(在评论中链接到github)。我的解决方法是

df.fillna('empty', inplace=True)

然后选择以下解决方案:

df1 = pd.pivot_table(df, index=cols,columns='id',aggfunc='size', fill_value=0)
杰斯雷尔(Jezrael)提议的

将按预期工作,因此可以接受答案。

答案 1 :(得分:0)

我认为需要将列名称转换为列表,然后将sizeunstack聚合:

df = pd.DataFrame({'B':[4,4,4,5,5,4],
                   'C':[1,1,9,4,2,3],
                   'D':[1,1,5,7,1,0],
                   'E':[0,0,6,9,2,4],
                   'id':list('aaabbb')})

print (df)
   B  C  D  E id
0  4  1  1  0  a
1  4  1  1  0  a
2  4  9  5  6  a
3  5  4  7  9  b
4  5  2  1  2  b
5  4  3  0  4  b

cols = df.columns.tolist()
df1 = df.groupby(cols)['id'].size().unstack(fill_value=0)
print (df1)
id       a  b
B C D E      
4 1 1 0  2  0
  3 0 4  0  1
  9 5 6  1  0
5 2 1 2  0  1
  4 7 9  0  1

使用pivot_table的解决方案:

df1 = pd.pivot_table(df, index=cols,columns='id',aggfunc='size', fill_value=0)
print (df1)
id       a  b
B C D E      
4 1 1 0  2  0
  3 0 4  0  1
  9 5 6  1  0
5 2 1 2  0  1
  4 7 9  0  1