熊猫枢轴和组

时间:2021-06-01 02:03:34

标签: pandas dataframe

city  sale_date    sale1   sale2  sale3 
city1  2020/07/08   100      200    300
city1  2020/07/09   200      300    400
city2  2020/07/08   111      222    333
...

我想得到波纹管数据框

               2020/07/08   2020/07/09 ...
city1  sale1   100          200
       sale2   200          300
       sale3   300          400    
city2  sale1   111          NaN
       sale2   222          NaN
       sale3   333          NaN

我尝试使用 pd.pivot,但它只是在日期上有多个重复的列

如果我旋转 3 次然后堆叠/连接它们

sale1_df = df.pivot(index='city',columns='sale_date',values='sale1')
sale2_df = df.pivot(index='city',columns='sale_date',values='sale2')
sale3_df = df.pivot(index='city',columns='sale_date',values='sale3')

排序后可能会起作用。但是有没有更简单的方法来实现这一目标? 如果有更多销售(例如:sale4、sale5、...),我无法想象

3 个答案:

答案 0 :(得分:2)

在需要退化为列的值的列名上设置索引、堆栈和取消堆栈

  df.set_index(['city', 'sale_date']).stack().unstack('sale_date').reset_index().rename(columns={'level_1': 'sale_type'})

sale_date   city sale_type  2020/07/08  2020/07/09
0          city1     sale1       100.0       200.0
1          city1     sale2       200.0       300.0
2          city1     sale3       300.0       400.0
3          city2     sale1       111.0         NaN
4          city2     sale2       222.0         NaN
5          city2     sale3       333.0         NaN

答案 1 :(得分:2)

您可以先使用 df.melt() 然后使用 df.pivot_table() 来完成此操作。

Melt() 进行了一种反透视,因此它会将您的 sale1、sale2... 变成行而不是列。然后 pivot_table() 会将您的“销售日期”变成列而不是行。

df2 = df.melt(id_vars=['city','sale_date'])
df2
city    sale_date   variable    value
0   city1   2020/07/08  sale1   100
1   city1   2020/07/09  sale1   200
2   city2   2020/07/08  sale1   111
3   city1   2020/07/08  sale2   200
4   city1   2020/07/09  sale2   300
5   city2   2020/07/08  sale2   222
6   city1   2020/07/08  sale3   300
7   city1   2020/07/09  sale3   400
8   city2   2020/07/08  sale3   333

您可以根据此处的文档设置“变量”和“值”的列名称 - https://pandas.pydata.org/docs/reference/api/pandas.melt.html

然后你可以pivot_table()在这个

df2.pivot_table(index=['city','variable'],columns='sale_date',values='value')
      sale_date 2020/07/08  2020/07/09
city    variable        
city1   sale1   100.0   200.0
        sale2   200.0   300.0
        sale3   300.0   400.0
city2   sale1   111.0   NaN
        sale2   222.0   NaN
        sale3   333.0   NaN

答案 2 :(得分:1)

最后添加stack

out = df.pivot(index = 'city',columns='sale_date').stack(level=0)