透视数据熊猫

lor*_*tar 3 python pandas

我正试图转动这些数据:

         ID
UserID
1        a1
1        a2
2        a1
2        a3
Run Code Online (Sandbox Code Playgroud)

进入如下数据框:

UserID   a1   a2   a3
1        1    1    0
2        1    0    1
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 6

第一列是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
Run Code Online (Sandbox Code Playgroud)

解决方案crosstab:

df = pd.crosstab(df.index,df['ID'])
print (df)
ID     a1  a2  a3
row_0            
1       1   1   0
2       1   0   1
Run Code Online (Sandbox Code Playgroud)

或者(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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

编辑:

似乎索引也可以通过索引名称选择(不确定它是否适用于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
Run Code Online (Sandbox Code Playgroud)