python - 枢轴熊猫数据框以正确顺序获取结果数据框
问题描述
我有以下格式的excel数据:
Original Data Frame
Package FISCAL_YR SCENARIO PERIOD USD_AMT LY_USD_AMT CY_NetSales LY_NetSales
Canada 2021 Plan Per01 1.00 2.00 3.00 4.00
Africa 2021 Actual Per04 1.00 2.00 3.00 4.00
Africa 2021 Actual Per09 1.00 2.00 3.00 4.00
Brazil 2021 Plan Per11 1.00 2.00 3.00 4.00
Brazil 2021 Actual Per05 1.00 2.00 3.00 4.00
Africa 2021 Actual Per07 1.00 2.00 3.00 4.00
Mexico 2021 Plan Per10 1.00 2.00 3.00 4.00
Canada 2021 Actual Per02 1.00 2.00 3.00 4.00
为了简化我的计算,我试图将场景列中的值与最后 4 列中的值进行适当分配:
Expected dataframe:
Actual Plan
Package Sum of USD_AMT Sum of LY_USD_AMT Sum of CY_NetSales Sum of LY_NetSales Sum of USD_AMT Sum of LY_USD_AMT Sum of CY_NetSales Sum of LY_NetSales
Africa 3 6 9 12
Brazil 2 4 6 8
Canada 1 2 3 4 1 2 3 4
Mexico 1 2 3 4
我正在 pandas 中为此尝试 Pivot table 选项,但它正在渲染以下输出:
失败解决方案:
pd_piv=pd.pivot_table(df_dummy,index=['Package', 'FISCAL_YR', 'PERIOD'],
columns=['SCENARIO'],
values=['USD_AMT', 'LY_USD_AMT', 'CY_NetSales', 'LY_NetSales'], aggfunc=np.sum, fill_value=0)
pd_piv.head()
CY_NetSales LY_NetSales LY_USD_AMT USD_AMT
SCENARIO Actual Plan WRKG_FCST Actual Plan WRKG_FCST Actual Plan WRKG_FCST Actual Plan WRKG_FCST
Package_SubCategory FISCAL_YR_NBR FISCAL_PERIOD_NBR
*数字未显示,因为实际数据有很大不同
反正有没有得到上面显示的预期数据框?
解决方案
也许这就是您正在寻找的: 1- 制作您的数据透视表:
import pandas as pd
import numpy as np
data={"package":["Canada","Africa","Africa","Brazil","Brazil","Africa","Mexico","Canada"],
"scenario":["Plan","Actual","Actual","Plan","Actual","Actual","Plan","Actual"],
"USD_AMT":[1,1,1,1,1,1,1,1,],
"LY_USD_AMT":[1,1,1,1,1,1,1,1,]}
df=pd.DataFrame(data)
pd_piv=pd.pivot_table(df,index=['package'],
columns=['scenario'],
values=['USD_AMT', 'LY_USD_AMT',], aggfunc=np.sum,fill_value=0)
结果:
LY_USD_AMT USD_AMT
scenario Actual Plan Actual Plan
package
Africa 3 0 3 0
Brazil 1 1 1 1
Canada 1 1 1 1
Mexico 0 1 0 1
2-交换索引级别:
pd_piv.columns=pd_piv.columns.swaplevel(0, 1)
pd_piv.sort_index(axis=1, level=0, inplace=True)
最后结果:
scenario Actual Plan
LY_USD_AMT USD_AMT LY_USD_AMT USD_AMT
package
Africa 3 3 0 0
Brazil 1 1 1 1
Canada 1 1 1 1
Mexico 0 0 1 1
推荐阅读
- c++ - 找出两个字符串输入是否是字谜,忽略空格、标点符号和数字
- php - 使用 Laravel Socialite 注册用户并重定向到表单以填写更多数据?
- sorting - 根据另一个表提供的某个列值对范围行进行排序
- sql - 使用以下 SQL Server TSQL 从 JSON 返回多行
- python - 在 python 中使用 shutil.copytree() 的问题
- java - 有没有办法在我的游戏中添加跳跃机制?
- c - 在堆栈上声明整数指针并在堆上分配值
- python - Alpha Vantage 使用 python 从损益表库中提取数据
- angular - 量角器测试中的正确用法是什么?等待期望(someFn()).toBe.. 或期望(await someFn()).toBe
- php - 在foreach php上更改对象的值