【发布时间】:2021-03-29 05:45:49
【问题描述】:
问题
我有一个广泛的数据框,其中显示了不同时间段内各州的销售价格和数量。但是我想将数据帧转换(反透视)成一个长数据帧。在 SQL 中使用 UNPIVOT 很容易做到这一点,但我正在努力弄清楚如何在 pandas 中做到这一点。任何帮助将不胜感激!
我的尝试
我尝试过同时使用 pd.melt 和 pd.wide_to_long,但没有成功。下面的例子。
示例
df = pd.DataFrame({'time': ['t1', 't2', 't3', 't4', 't5'],
'prod': ['A', 'B', 'C', 'D', 'E'],
'price_qld': [4, 3, 6, 3, 8],
'price_nsw': [7, 4, 7, 3, 5],
'price_vic': [9, 4, 6, 23, 7],
'vol_qld': [11, 43, 232, 234, 42],
'vol_nsw': [73, 44, 657, 53, 785],
'vol_vic': [95, 34, 666, 273, 87],
'flag_qld': [1, 1, 1, 1, 0],
'flag_nsw': [0, 1, 0, 1, 0],
'flag_vic': [1, 1, 1, 0, 1]
})
print(df)
new_df = pd.wide_to_long(df, ['price', 'vol', 'flag'], i=['time', 'prod'], j='State', sep='_')
当前数据框
time prod price_qld price_nsw ... vol_vic flag_qld flag_nsw flag_vic
0 t1 A 4 7 ... 95 1 0 1
1 t2 B 3 4 ... 34 1 1 1
2 t3 C 6 7 ... 666 1 0 1
3 t4 D 3 3 ... 273 1 1 0
4 t5 E 8 5 ... 87 0 0 1
所需的数据框
time prod state price vol flag
0 t1 A qld 4 11 1
1 t1 A nsw 7 73 0
2 t1 A vic 9 95 1
3 t2 B qld 3 43 1
4 t2 B nsw 4 44 1
5 t2 B vic 4 34 1
6 t3 C qld 6 232 1
7 t3 C nsw 7 657 0
8 t3 C vic 6 666 1
【问题讨论】:
标签: python pandas dataframe unpivot