- 方案:**我正尝试根据一组条件在 Dataframe 中创建多行。
- Dataframe 示例**(这是使用Pandas从xlsx文件导入):
Model Scenario Region Variable Unit Year1 Year2 ... Year50
1 Base 1 GDP M USD 10 15 20
1 Base 2 GDP M USD 30 35 50
1 Base 3 GDP M USD 20 75 80
1 Stress 1 1 GDP % diff 0.48 0.11 0.31
1 Stress 1 2 GDP % diff 0.12 0.33 0.89
1 Stress 1 3 GDP % diff 0.76 0.54 0.08
1 Stress 2 1 GDP % diff 0.37 0.94 0.13
1 Stress 2 2 GDP % diff 0.73 0.76 0.35
1 Stress 2 3 GDP % diff 0.15 0.45 0.37
1 Stress 3 1 GDP % diff 0.49 0.14 0.37
1 Stress 3 2 GDP % diff 0.14 0.73 0.94
1 Stress 3 3 GDP % diff 0.96 0.26 0.85
- 观察结果:**每个压力情景都是相对于基本情景的%变化(对于相同的区域和变量)。这意味着它们是基本值 * 1+压力值。
- 观察结果2:**原始 Dataframe 具有更多模型、场景、区域和变量,但它们始终相同(所有模型具有相同的场景集,所有场景具有相同的区域集,以此类推)。
- 目标:**是使每行的值与基线的单位相同。为此,我需要执行上面提到的乘法。
公式如下:
Model Scenario ... Year1 Year2 ... Year50
1 Stress 1 10*(1+0.48) 15*(1+0.11) 20*(1+0.31)
输出结果为:
Model Scenario ... Year1 Year2 ... Year50
1 Stress 1 14.8 16.65 26.2
- 我已经尝试过的:**我正在尝试使用df. loc函数来查找匹配的值,并使用它们来进行计算:
test_df.loc[((test_df['Model'] == '1') & (test_df['Scenario'] == 'Stress1') & (test_df['Region'] == "1") & (test_df['Variable'] == 'GDP'))] = test_df.loc[((test_df['Model'] == '1') & (test_df['Scenario'] == 'Base') & (test_df['Region'] == "1") & (test_df['Variable'] == 'GDP'))] * (1 + test_df.loc[((test_df['Model'] == '1') & (test_df['Scenario'] == 'Stress1') & (test_df['Region'] == "1") & (test_df['Variable'] == 'GDP'))])
- 观察结果3:**我认为该方法存在两个问题:首先,我不能正确地控制"年"列的值;其次,我不确定如何对整个 Dataframe 立即执行此操作,而不必为模型/场景/区域/变量的每个可能组合创建一行。
- 问题:**是否有执行此操作的方法?如果有,最佳方法是什么?
1条答案
按热度按时间5f0d552i1#
第一个过滤器
Base
Dataframe -在样本数据中可能仅使用基本条件test_df['Scenario'] == 'Base'
,并转换用于正确对齐另一个 Dataframe 的列-此处'Model','Region','Variable'
、Scenario, Unit
不同,因此省略,并且也是过滤列列表:类似的方法用于
df2
:由于
df1.index
中的某些级别与df2.index
匹配,并且df1
中的唯一索引在1
加上df1
乘以df2
之后是可能的: