Python / Pandas:使用2个DataFrame消除循环

时间:2017-12-08 14:48:27

标签: python pandas loops dataframe

第一次在这里问一个问题,希望我能清楚地说明问题。我试图了解如何更好地将一个场景列表(通过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

  1. 遍历df_analysts数据框中的每个方案
  2. 将权重方案应用于每个因子等级(如果等级= 1,则1.0 *权重,等级= 2,然后0.68 *权重,等级= 3,然后0.32 *权重)。这些结果进入W1-W4专栏。
  3. 求和W1-W4列。
  4. 对SUM(W)列进行排名。
  5. 下面针对单个场景的结果示例(例如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
    

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