首先使用read_csv 创建DataFrame:
df = pd.to_csv('file.csv')
然后需要set_index 和unstack:
df1 = df.set_index(['user_id','col'])['val'].unstack(fill_value=0)
print (df1)
col 1 2 3 4
user_id
8901 55 66 0 0
11501 77 0 88 99
使用pivot 的另一种解决方案,将NaN 替换为0 为fillna,最后转换为int:
df1 = df.pivot(index='user_id', columns='col', values='val').fillna(0).astype(int)
print (df1)
col 1 2 3 4
user_id
8901 55 66 0 0
11501 77 0 88 99
如果出现错误:
“ValueError:索引包含重复条目,无法重塑”
这意味着你有一些重复,所以最快的解决方案是 groupby 和 unstack 和一些像 mean 或 sum 这样的聚合函数:
print (df.groupby(['user_id','col'])['val'].mean().unstack(fill_value=0))
col 1 2 3 4
user_id
8901 55 66 0 0
11501 77 0 88 99
稍微改一下就好了csv:
print (df)
user_id col val
0 8901 1 55
1 8901 2 66
2 11501 1 77 > duplicates -> 11501 and 1
3 11501 1 151 > duplicates -> 11501 and 1
4 11501 3 88
5 11501 4 99
print (df.groupby(['user_id','col'])['val'].mean().unstack(fill_value=0))
col 1 2 3 4
user_id
8901 55 66 0 0
11501 114 0 88 99
其实我以为我没有重复,但发现我真的有一些......
我不能使用“.mean”,因为它是分类值,但是通过首先查看排序表然后只保留最后一个条目来解决问题......然后应用(很棒!)解决方案..我仍然必须这样做完全理解;-)
df.sort(columns=(['user_id','col']) ) # optional for debugging
df.drop_duplicates(subset=['user_id','col'], keep='last', inplace=True)
df_table = df.set_index(['user_id','col'])['val'].unstack(fill_value=0)