我有以下格式的每日销售数据
col1 col2 col3 d_1 d_2 d_3 d_4
dog yes US 6 4 2 1
dog no US 4 3 2 5
cat yes US 4 2 0 1
其中 d_1、d_2 等代表第 1 天、第 2 天等的数字。我希望最终得到一个格式如下的新表:
col1 col2 col3 day sales
dog yes US d_1 6
dog yes US d_2 4
dog yes US d_3 2
dog yes US d_4 1
dog no US d_1 4
dog no US d_2 3
dog no US d_3 2
dog no US d_4 5
cat yes US d_1 4
cat yes US d_2 2
cat yes US d_3 0
cat yes US d_4 1
我该怎么做?我发现的最接近的是 df.set_index(['col1','col2','col3']).stack()
但它仍然没有完全完成上述操作,它一直将 d_1、d_2 等视为索引,而不是像上面的示例一样将其转换为真正的堆叠数据。
最佳答案
pd.melt
它带有方便的参数来重命名列,使其成为一次性 reshape 和重命名所有列的最简单方法:
value_vars = ['d_1', 'd_2', 'd_3', 'd_4']
id_vars = ['col1', 'col2', 'col3']
df.melt(id_vars, value_vars, var_name='day', value_name='sales')
col1 col2 col3 day sales
0 dog yes US d_1 6
1 dog no US d_1 4
2 cat yes US d_1 4
3 dog yes US d_2 4
4 dog no US d_2 3
5 cat yes US d_2 2
6 dog yes US d_3 2
7 dog no US d_3 2
8 cat yes US d_3 0
9 dog yes US d_4 1
10 dog no US d_4 5
11 cat yes US d_4 1
pd.wide_to_long
考虑到您有明确定义的 stub ('d_'
),还有另一种可能性。这里的 day
列将只是 'd_'
被删除时的数字
(pd.wide_to_long(df, i=['col1', 'col2', 'col3'], j='day', stubnames=['d'], sep='_')
.rename(columns={'d': 'sales'})
.reset_index())
关于python - 我可以 unstack() pandas 中列的子集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61331133/