我想在python中为数据框创建重复的行。数据框看起来像这样
SKU Ids wk_1 wk_2 wk_3 wk_4 wk_5 wk_6
10 20 1 2 3 4 5 6
30 40 6 5 4 3 2 1
我希望输出为
SKU Ids wk value
10 20 wk_1 1
10 20 wk_2 2
10 20 wk_3 3
10 20 wk_4 4
10 20 wk_5 5
10 20 wk_6 6
30 40 wk_1 6
30 40 wk_2 5
30 40 wk_3 4
30 40 wk_4 3
30 40 wk_5 2
30 40 wk_6 1
我正在尝试使用pivot_table,但它向我显示错误
hqp = hq.pivot_table(columns=['sku', 'ids','value'],
index= ['sku', 'ids'],
values = ['wk_1', 'wk_2', 'wk_3', 'wk_4','wk_5', 'wk_6'])
答案 0 :(得分:5)
wide_to_long
的构建方式
pd.wide_to_long(df,['wk'],i=['SKU','Ids'],j='value',sep='_').reset_index()
Out[28]:
SKU Ids value wk
0 10 20 1 1
1 10 20 2 2
2 10 20 3 3
3 10 20 4 4
4 10 20 5 5
5 10 20 6 6
6 30 40 1 6
7 30 40 2 5
8 30 40 3 4
9 30 40 4 3
10 30 40 5 2
11 30 40 6 1
答案 1 :(得分:3)
将SKU
和Ids
设置为索引,然后依次设置stack
和reset_index
和rename
:
df = df.set_index(['SKU','Ids'])\
.stack().reset_index()\
.rename(columns={'level_2':'wk',0:'value'})
或者:
df = df.set_index(['SKU','Ids'])\
.stack().reset_index(name='value')\
.rename(columns={'level_2':'wk'})
或者根据评论中的W-B
建议,使用melt
和sort_values
的另一种方法:
df = df.melt(id_vars=['SKU','Ids'])\
.rename(columns={'variable':'wk'})\
.sort_values(['SKU','Ids'])
print(df)
SKU Ids wk value
0 10 20 wk_1 1
1 10 20 wk_2 2
2 10 20 wk_3 3
3 10 20 wk_4 4
4 10 20 wk_5 5
5 10 20 wk_6 6
6 30 40 wk_1 6
7 30 40 wk_2 5
8 30 40 wk_3 4
9 30 40 wk_4 3
10 30 40 wk_5 2
11 30 40 wk_6 1