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

时间:2019-07-24 05:20:37

标签: python 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]
})

即。

   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

我想tidy ("melt")此数据,以便甜点 type 是单独的观察结果。但是我也想保留每个用户的分数。

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

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

...给予:

   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

我丢失了得分数据!

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

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

如何整理这些数据,但保留不包含在整理中的列?

1 个答案:

答案 0 :(得分:1)

将列Score添加到DataFrame.melt中的id_vars

  

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

如果需要熔化所有没有User IDScore的列,则忽略value_vars

df.melt(
    id_vars=['User ID', 'Score'],
    var_name='Dessert', value_name='Enjoyment'
)