python - 我可以 unstack() pandas 中列的子集吗?

标签 python pandas

我有以下格式的每日销售数据

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/

相关文章:

python - 如何选择在 Pandas 数据框中持续存在的数据

python - networkx:在边缘绘制文本

python - 使用 bokeh 或 matplotlib 的 Pandas DataFrame 分层饼图/ donut chart

python - 将 python 变量从对象传递给父对象

python - PyTorch - 如何在训练期间获得学习率?

python - Pandas :具有复杂条件的数据框自连接

python - pandas to_sql() 错误 - 超出了准备语句每个 session 20 MB 的内存限制

python - 试图在数据框中删除 NaN 索引行

Python:是否有支持大量隧道的 ssh python 模块?

python - urllib 与 elementtree 结合