数据框 - 从宽到长重塑数据框

时间:2021-03-01 14:21:50

标签: python pandas dataframe

我有一个像这样的数据框:

<头>
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_”(因为会有很多)?

1 个答案:

答案 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