pandas 使用多索引重塑 Dataframe 并相应地填充数据

vngu2lb8  于 2023-05-05  发布在  其他
关注(0)|答案(3)|浏览(128)

这是我的dataframe:
| 客户ID|产物|成本|退货价格|数量|
| --------------|--------------|--------------|--------------|--------------|
| 一百二十三|铅笔|10个|五|二|
| 一百二十三|书|二十|10个|1|
| 五四三|锉|七十个|五十|三|
| 五四三|铅笔|二十|四|三|
| 五四三|书|八十|五十六|七|
我想要转换后的输出与multi_index

请让我知道如何做到这一点?

header = pd.MultiIndex.from_product(\[product_list,\['Apportioned','Unutilised','outstanding','Exposure'\]\])
new_df=pd.DataFrame('',index=cpid_list,columns=header)
print(new_df)

但我无法获得填充的值。
请帮帮忙

ffscu2ro

ffscu2ro1#

以下是melt/pivot的一个选项:

out = (df.melt(id_vars=["cust_id", "product"])
           .pivot(index="cust_id", columns=["product", "variable"], values="value")
           .sort_index(axis=1).rename_axis(index="", columns=[None, None]).reset_index()
           .rename(columns={"": "cust_id"}, level=1)
      )​

输出:

print(out)

           book                        file                       pencil                      
  cust_id  cost quantity return price  cost quantity return price   cost quantity return price
0     123 20.00     1.00        10.00   NaN      NaN          NaN  10.00     2.00         5.00
1     543 80.00     7.00        56.00 70.00     3.00        50.00  20.00     3.00         4.00
7bsow1i6

7bsow1i62#

示例

data = {'cust_id': {0: 123, 1: 123, 2: 543, 3: 543, 4: 543},
 'product': {0: 'pencil', 1: 'book', 2: 'file', 3: 'pencil', 4: 'book'},
 'cost': {0: 10, 1: 20, 2: 70, 3: 20, 4: 80},
 'return_price': {0: 5, 1: 10, 2: 50, 3: 4, 4: 56},
 'quantity': {0: 2, 1: 1, 2: 3, 3: 3, 4: 7}}

df = pd.DataFrame(data)

df

cust_id product cost    return_price    quantity
0   123     pencil  10      5               2
1   123     book    20      10              1
2   543     file    70      50              3
3   543     pencil  20      4               3
4   543     book    80      56              7

编码

set_indexunstack

df.set_index(['cust_id', 'product']).stack().unstack([1, 2])

output

product     pencil                              book                                file
            cost    return_price    quantity    cost    return_price    quantity    cost    return_price    quantity
cust_id                                 
123         10.0            5.0         2.0     20.0            10.0        1.0     NaN         NaN     NaN
543         20.0            4.0         3.0     80.0            56.0        7.0     70.0        50.0    3.0

stack的使用是为了确定多索引级别的顺序。也可以使用swaplevel

qmb5sa22

qmb5sa223#

另一种可能的解决方案:

(pd.pivot_table(
    df,index=['cust_id'], columns=['product'], 
    values=['cost', 'quantity', 'return price'])
 .swaplevel(axis=1).sort_index(axis=1).reset_index())

输出:

product cust_id  book                        file                         
                 cost quantity return price  cost quantity return price   
0           123  20.0      1.0         10.0   NaN      NaN          NaN  \
1           543  80.0      7.0         56.0  70.0      3.0         50.0   

product pencil                        
          cost quantity return price  
0         10.0      2.0          5.0  
1         20.0      3.0          4.0

相关问题