我有一个要尝试旋转的形状为(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)
任何同志都非常感激
答案 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)
我认为需要将列名称转换为列表,然后将size
与unstack
聚合:
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