我有一个像这样的数据框:
id | item_1 | item_2 | item_3 | price_1 | price_2 | price_3 | 注意 |
---|---|---|---|---|---|---|---|
user1 | 苹果 | 橙色 | 水 | 2.00 | 1.50 | 0.80 | 没什么 |
user2 | 香蕉 | 牛奶 | 苹果 | 0.50 | 3.50 | 2.00 | 1袋 |
我想把它变成这样:
id | 项目 | 价格 | 注意 | 数量 |
---|---|---|---|---|
user1 | 苹果 | 2.00 | 没什么 | 1 |
user1 | 橙色 | 1.50 | 没什么 | 2 |
user1 | 水 | 0.80 | 没什么 | 3 |
user2 | 香蕉 | 0.50 | 1袋 | 1 |
user2 | 牛奶 | 3.50 | 1袋 | 2 |
user2 | 苹果 | 2.00 | 1袋 | 3 |
是否可以不用手动输入那些“item_”和“price_”(因为会有很多)?
答案 0 :(得分:2)
使用带有指定参数的 wide_to_long
:
df = pd.wide_to_long(df,
stubnames=['item','price'],
i=['id','note'],
j='number', sep='_').reset_index()
print (df)
id note number item price
0 user1 nothing 1 apple 2.0
1 user1 nothing 2 orange 1.5
2 user1 nothing 3 water 0.8
3 user2 1 bag 1 banana 0.5
4 user2 1 bag 2 milk 3.5
5 user2 1 bag 3 apple 2.0
或者先转换所有非 _
列,用 _
拆分所有列,然后通过 DataFrame.stack
重新整形:
df1 = df.set_index(['id','note'])
df1.columns = df1.columns.str.split('_', expand=True)
df1 = df1.rename_axis((None, 'number'), axis=1).stack().reset_index()
print (df1)
id note number item price
0 user1 nothing 1 apple 2.0
1 user1 nothing 2 orange 1.5
2 user1 nothing 3 water 0.8
3 user2 1 bag 1 banana 0.5
4 user2 1 bag 2 milk 3.5
5 user2 1 bag 3 apple 2.0