我正试图透视这些数据:
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