如何在 Pandas 中整理(融化)数据并保留所有其他列?

det*_*tly 6 python pandas

考虑这个 Pandas 数据框:

df = pd.DataFrame({
    'User ID': [1, 2, 2, 3],
    'Cupcakes': [1, 5, 4, 2],
    'Biscuits': [2, 5, 3, 3],
    'Score': [0.65, 0.12, 0.15, 0.9]
})
Run Code Online (Sandbox Code Playgroud)

IE。

   User ID  Cupcakes  Biscuits  Score
0        1         1         2   0.65
1        2         5         5   0.12
2        2         4         3   0.15
3        3         2         3   0.90
Run Code Online (Sandbox Code Playgroud)

我想整理(“融化”)这些数据,以便甜点类型是单独的观察结果。但我也想保留每个用户的分数。

melt()直接使用不起作用:

df.melt(
    id_vars=['User ID'],
    value_vars=['Cupcakes', 'Biscuits'],
    var_name='Dessert', value_name='Enjoyment'
)
Run Code Online (Sandbox Code Playgroud)

...给出:

   User ID   Dessert  Enjoyment
0        1  Cupcakes          1
1        2  Cupcakes          5
2        2  Cupcakes          4
3        3  Cupcakes          2
4        1  Biscuits          2
5        2  Biscuits          5
6        2  Biscuits          3
7        3  Biscuits          3
Run Code Online (Sandbox Code Playgroud)

分数数据丢了!

我无法使用,wide_to_long()因为我的甜点类型没有通用的“存根名称”。

我无法将整理后的数据与原始数据连接或合并,因为整理后的数据已重新编制索引,并且每次观察的用户 ID 都不是唯一的。

如何整理这些数据但保留不参与整理的列?

jez*_*ael 6

将列添加Scoreid_varsin DataFrame.melt

id_vars : 元组、列表或 ndarray,可选

用作标识符变量的列。

df1 = df.melt(
    id_vars=['User ID', 'Score'],
    value_vars=['Cupcakes', 'Biscuits'],
    var_name='Dessert', value_name='Enjoyment'
)
print (df1)
   User ID  Score   Dessert  Enjoyment
0        1   0.65  Cupcakes          1
1        2   0.12  Cupcakes          5
2        2   0.15  Cupcakes          4
3        3   0.90  Cupcakes          2
4        1   0.65  Biscuits          2
5        2   0.12  Biscuits          5
6        2   0.15  Biscuits          3
7        3   0.90  Biscuits          3
Run Code Online (Sandbox Code Playgroud)

如果需要在没有User IDScore省略的情况下熔化所有列value_vars

df.melt(
    id_vars=['User ID', 'Score'],
    var_name='Dessert', value_name='Enjoyment'
)
Run Code Online (Sandbox Code Playgroud)