熊猫在使用与列标题相同的列值时旋转一列

时间:2018-06-20 15:05:30

标签: python pandas

我想在数据框中旋转一列,其中列值成为列标题,而这些列的实际值变成10

示例:

        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()

完成上述操作后,您将在各列中分别获得NaNanswer_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函数中有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您只想依靠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