考虑此熊猫数据框:
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都不唯一。
如何整理这些数据,但保留不包含在整理中的列?
答案 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 ID
和Score
的列,则忽略value_vars
:
df.melt(
id_vars=['User ID', 'Score'],
var_name='Dessert', value_name='Enjoyment'
)