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、...),我无法想象
答案 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)