我正试图透视这些数据:

         ID
UserID
1        a1
1        a2
2        a1
2        a3

数据帧格式如下:
UserID   a1   a2   a3
1        1    1    0
2        1    0    1

我试过做下面的df = pd.pivot_table(df, index='UserID', columns='ID',但它给了我一个DataError: No numeric types to aggregate错误我能做什么?

最佳答案

第一列是index,因此需要将index='UserID'更改为index=df.index
聚合函数也GroupBy.size

df = pd.pivot_table(df, index=df.index, columns=df['ID'], aggfunc='size', fill_value=0)
print (df)
ID      a1  a2  a3
UserID
1        1   1   0
2        1   0   1

含有crosstab的溶液:
df = pd.crosstab(df.index,df['ID'])
print (df)
ID     a1  a2  a3
row_0
1       1   1   0
2       1   0   1

或(pandas 0.20.1+)溶液-groupby通过index与柱一起,聚合size并通过unstack重塑:
df = df.groupby(['UserID','ID']).size().unstack(fill_value=0)
print (df)
ID      a1  a2  a3
UserID
1        1   1   0
2        1   0   1

pandas bellow 0.20.1解决方案-通过reset_index将索引转换为列:
df = df.reset_index().groupby(['UserID','ID']).size().unstack(fill_value=0)
print (df)
ID      a1  a2  a3
UserID
1        1   1   0
2        1   0   1

编辑:
似乎索引也可以按索引名选择(不确定是否在0.20.1下工作):
df = pd.pivot_table(df, index='UserID', columns='ID', aggfunc='size', fill_value=0)
print (df)
ID      a1  a2  a3
UserID
1        1   1   0
2        1   0   1

08-25 06:43
查看更多