我想旋转数据框中的一列,其中列值成为列标题,而这些列的实际值变为 1
或 0
。
示例:
movie_id cluster_id answer_id
0 73 1 4
1 80 1 5
4 81 1 2
7 84 1 1
10 88 1 1
11 83 1 4
13 85 1 1
16 54 1 1
22 79 1 3
23 87 1 1
我希望枢轴后的结果是:
movie_id cluster_id 1 2 3 4 5
0 73 1 0 0 0 1 0
1 80 1 0 0 0 0 1
4 81 1 0 1 0 0 0
一种方法是将 answer_id
列复制到不同的名称,然后在 pivot_table
函数中使用它。但不确定如何完成填充,或者总体上是否有更好的方法可以在不实际复制列的情况下执行此操作。
pivot_df = df.pivot_table(
values='copy_answer_id',
index=['movie_id', 'cluster_id'],
columns='answer_id').reset_index()
完成上述操作后,您将获得所有 NaN
和相应列的 answer_id
中的内容。
movie_id cluster_id 1 2 3 4 5
0 73 1 NaN NaN NaN 4 NaN
1 80 1 NaN NaN NaN NaN 5
4 81 1 NaN 2 NaN NaN NaN
然后我可以这样做:
cols = [1,2,3,4,5]
pivot_df[cols] = pivot_df[cols].replace({1:1,2:1,3:1,4:1,5:1})
之后将 NaN
转换为零:
我可以执行 pivot_df.fillna(0, inplace=True)
将所有 NaN
转换为零。
但是否有更好的方法在 pivot_table
函数中执行此操作。
最佳答案
如果您只想依赖 pivot_table
。你可以这样做:
# Use a temporary column with values one, pivot and fill nan with 0
new = df.assign(val=1).pivot_table(columns='answer_id',index=['cluster_id','movie_id'],values='val',fill_value=0).reset_index()
或者,您可以使用 get_dummies
,因为它比 pivot_table
更快,即:
new = pd.concat([df[['movie_id','cluster_id']],pd.get_dummies(df['answer_id'])],1)
movie_id cluster_id 1 2 3 4 5
0 73 1 0 0 0 1 0
1 80 1 0 0 0 0 1
4 81 1 0 1 0 0 0
7 84 1 1 0 0 0 0
10 88 1 1 0 0 0 0
11 83 1 0 0 0 1 0
13 85 1 1 0 0 0 0
16 54 1 1 0 0 0 0
22 79 1 0 0 1 0 0
23 87 1 1 0 0 0 0
关于python - Pandas 旋转一列,同时使用相同的列值作为列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951412/