如何在 Pandas 数据透视表上添加列(多列)

时间:2021-03-11 10:05:20

标签: pandas dataframe pivot-table multiple-columns multi-index

请告诉我如何添加列? 此 DataFrame 要透视。

|date      |country|type|qty|
|----------|-------|----|---|
|2021/03/01|jp     |A   |10 |
|2021/03/01|en     |C   |20 |
|2021/03/01|jp     |C   |15 |
|2021/03/02|jp     |A   |10 |
|2021/03/02|en     |A   |20 |
|2021/03/02|en     |C   |15 |

(旋转)

|     |2021/03/01|2021/03/02|
|-----|----------|----------|
|     |jp   |en  |jp   |en  |
|-----|----------|----------|
| A   |10   | 0  |50   |30  |
| C   |15   | 15 |0    |75  |

我想添加“费率列”

|     |2021/03/01           |2021/03/02            |
|-----|---------------------|----------------------|
|     |    jp    |    en    |    jp    |    en     |
|-----|---------------------|----------------------|
|     |cnt | rate|cnt  |rate|cnt | rate|cnt  |rate |
|-----|----------|----------|----------|-----------|
| A   |10  | 0.4 | 0   | 0  |50  | 1   | 30  | 0.26|
| C   |15  | 0.6 | 15  | 1  |0   | 0   | 85  | 0.74|

1 个答案:

答案 0 :(得分:3)

您可以使用 concatkeys 参数将值除以总和,然后添加 DataFrame.reorder_levels 并排序 MultiIndex

#change to your function if necessary
df1 = df.pivot_table(index='type', columns=['date','country'], values='qty', fill_value=0)
print (df1)
date    2021/03/01     2021/03/02    
country         en  jp         en  jp
type                                 
A                0  10         20  10
C               20  15         15   0

df = (pd.concat([df1, df1.div(df1.sum())], axis=1, keys=('cnt','rate'))
        .reorder_levels([1,2,0], axis=1)
        .sort_index(axis=1))
print (df)
date    2021/03/01               2021/03/02                   
country         en       jp              en            jp     
               cnt rate cnt rate        cnt      rate cnt rate
type                                                          
A                0  0.0  10  0.4         20  0.571429  10  1.0
C               20  1.0  15  0.6         15  0.428571   0  0.0
相关问题