第一次在这里问一个问题,希望我能清楚地说明问题。我试图了解如何更好地将一个场景列表(通过for循环)应用于同一数据集并总结结果。 *请注意,一旦应用方案,我从数据框中提取相关统计数据并将其放入汇总表,我不需要保留信息。由于我有数万个我想要运行的场景,因此Iterrows非常缓慢。感谢您抽出宝贵时间进行审核。
我有两个Pandas数据帧:df_analysts和df_results:
1)df_analysts包含一系列因素(例如TB,JK,SF,PWR)权重情景(例如50,50,50,50)
TB JK SF PWR
0 50 50 50 50
1 50 50 50 100
2 50 50 50 150
3 50 50 50 200
4 50 50 50 250
2)df_results按日期和组保存结果,然后根据每个因素进行排名,最后得到最终结果。
Date GR Ent TB-R JK-R SF-R PWR-R Fin W1 W2 W2 W4 SUM(W)
0 11182017 1 1 2 1 2 1 2
1 11182017 1 2 3 2 3 2 1
2 11182017 1 3 1 3 1 3 3
3 11182017 2 1 1 2 2 1 1
4 11182017 2 2 2 1 1 2 1
3)我正在使用iterrows
下面针对单个场景的结果示例(例如50,50,50,50)
Date GR Ent TB-R JK-R SF-R PWR-R Fin W1 W2 W2 W4 SUM(W) Rank
0 11182017 1 1 2 1 2 1 1 34 50 34 50 168 1
1 11182017 1 2 3 2 3 2 3 16 34 16 34 100 3
2 11182017 1 3 1 3 1 3 2 50 16 50 16 132 2
3 11182017 2 1 2 2 2 1 1 34 34 34 50 152 2
4 11182017 2 2 1 1 1 2 1 50 50 50 34 184 1
4)最后,对于每个场景,我正在为汇总结果创建一个新的数据帧(df_summary),它记录使用的因子/权重场景(来自df_analysts)并将RANK结果与按日期和组完成比较并保持他们降落的地方。下面的示例(上面仅显示了50,50,50,50场景,结果为1,1)。
Factors Weights Top Top2
0 (TB,JK,SF,PWR) (50,50,50,50) 1 1
1 (TB,JK,SF,PWR) (50,50,50,100) 1 0
2 (TB,JK,SF,PWR) (50,50,50,150) 1 1
3 (TB,JK,SF,PWR) (50,50,50,200) 1 0
4 (TB,JK,SF,PWR) (50,50,50,250) 1 1
答案 0 :(得分:1)
您可以合并分析师和结果数据框,然后执行计算。
def factor_rank(x,y):
if (x==1): return y
elif (x==2): return y*0.68
elif (x==3): return y*0.32
df_analysts.index.name='SCENARIO'
df_analysts.reset_index(inplace=True)
df_analysts['key'] = 1
df_results['key'] = 1
df = pd.merge(df_analysts, df_results, on='key')
df.drop(['key'],axis=1,inplace=True)
df['W1'] = df.apply(lambda r: factor_rank(r['TB-R'], r['TB']), axis=1)
df['W2'] = df.apply(lambda r: factor_rank(r['JK-R'], r['JK']), axis=1)
df['W3'] = df.apply(lambda r: factor_rank(r['SF-R'], r['SF']), axis=1)
df['W4'] = df.apply(lambda r: factor_rank(r['PWR-R'], r['PWR']), axis=1)
df['SUM(W)'] = df.W1 + df.W1 + df.W3 + df.W4
df["rank"] = df.groupby(['GR','SCENARIO'])['SUM(W)'].rank(ascending=False)
您可能还想查看此问题,该问题涉及改进基于行的计算的处理时间:
How to apply a function to mulitple columns of a pandas DataFrame in parallel