如何将列标签转换为列中的值?

时间:2019-02-22 04:16:13

标签: python python-3.x pandas dataframe jupyter-notebook

我有一个DataFrame ratings,它代表数据的原始形式。

ratings
        user_id  movie_id  rating
    32236   1      1         5
    23171   1      2         3
    83307   1      3         4
    70539   1      7         4
    13542   1      10        3
    39562   2      10        2
    172     5      2         3
    50664   6      7         2
    11223   7      7         5
    8285    7      8         5
    5643    7      10        4
    12746   8      7         3
    81332   9      7         4
    606     10     7         4

还有另一个数据框df_1,该数据框是在应用ratings.pivot_table(index=['movie_id'], columns='user_id', values='rating', fill_value=0).rename_axis(None, axis=1).reset_index()后从该数据框派生的

df_1
   movie_id  1  2  5  6  7  8  9  10   IRAM
1     2      3  0  3  0  0  0  0   0    2
6     7      4  0  0  2  5  3  4   4    4
9     10     3  2  0  0  4  0  0   0    1
2     3      4  0  0  0  0  0  0   0    3 

如何将df_1转换成ratings的形式(可以删除IRAM)?


使用@meW的建议输出。

    movie_id  user_id   rating
0      9         1        5
1      5         1        3
2      2         1        3
3      2         5        3
4      9         6        4
5      9         7        5
6      9         10       4
7      9       borda      18
8      5       borda      3
9      2       borda      6
10     9        rank      3
11     5        rank      9
12     2        rank      7

2 个答案:

答案 0 :(得分:2)

使用melt

ndf = ratings.pivot_table(index=['movie_id'], columns='user_id', values='rating', fill_value=0).rename_axis(None, axis=1).reset_index()

t = pd.melt(ndf, id_vars='movie_id')
t = t[t.value != 0].reset_index(drop=True)
t.rename(columns={'value': 'rating', 'variable': 'user_id'}, inplace=True)

解决方案的验证

df.loc[:, ['movie_id', 'user_id', 'rating']].eq(t)

+----+----------+---------+--------+
|    | movie_id | user_id | rating |
+----+----------+---------+--------+
|  0 | True     | True    | True   |
|  1 | True     | True    | True   |
|  2 | True     | True    | True   |
|  3 | True     | True    | True   |
|  4 | True     | True    | True   |
|  5 | True     | True    | True   |
|  6 | True     | True    | True   |
|  7 | True     | True    | True   |
|  8 | True     | True    | True   |
|  9 | True     | True    | True   |
| 10 | True     | True    | True   |
| 11 | True     | True    | True   |
| 12 | True     | True    | True   |
| 13 | True     | True    | True   |
+----+----------+---------+--------+

答案 1 :(得分:0)

unstack是您要找的吗?

>>>df1
   movie_id  1  2  5  6  7  8  9  10
0         2  3  0  3  0  0  0  0   0
1         3  4  0  0  0  0  0  0   0
2         7  4  0  0  2  5  3  4   4
3         8  0  0  0  0  5  0  0   0
4        10  3  2  0  0  4  0  0   0

df1 = df1.set_index('movie_id').unstack().reset_index()
df1.columns = ['user_id', 'movie_id', 'rating']

>>>df1
    user_id  movie_id  rating
0         1         2       3
1         1         3       4
2         1         7       4
3         1         8       0
4         1        10       3
5         2         2       0
6         2         3       0
7         2         7       0
8         2         8       0
9         2        10       2
10        5         2       3
11        5         3       0
12        5         7       0
13        5         8       0
14        5        10       0
15        6         2       0
16        6         3       0
17        6         7       2
18        6         8       0
.
.
.