熊猫foreach行乘法 - 加速

时间:2017-03-26 06:53:40

标签: python pandas

我有极端慢代码:

名为tmp的DataFrame,其MultiIndex(日期和ID)大约有2.000.000行和2列(V1,V2)。

                      V1    V2
Date          ID
2000-01-01    1      0.3   0.1
2000-01-01    2      0.3   0.1
2000-01-02    1      0.1   0.1
       .....

ref包含大约5.000行,250列

       C1   C2 ...  C250
ID
1     0.2  0.3 ...  0.1
2     1.2  1.3 ...  0.0

预期结果应具有以下形式:

            C1   C2   ...  C250
Date
2000-01-01   xx  xx   ...  xx

我已尝试过:

    sum1 = pd.DataFrame(0, index=idx1, columns=idx2)
    sum2 = pd.DataFrame(0, index=idx1, columns=idx2)

    def gen(row):
        i1 = row.name[0] # date
        i2 = row.name[1] # id

        sum1.loc[i1] += ref.loc[i2] * row['V1']
        sum2.loc[i1] += ref.loc[i2] * row['V2']

    tmp.apply( gen , axis=1)

是否有可能加快速度 - 我已经尝试过使用Cython但3小时后杀了应用程序......

1 个答案:

答案 0 :(得分:0)

我认为您需要mul,然后按reset_index移除id的{​​{1}}级:

MultiIndex
tmp = pd.DataFrame({'date':pd.date_range('2000-01-01', periods=3),
                    'id':[1,2,1],
                    'V1':[.3,.3,.1],
                    'V2':[.1,.1,.1]}).set_index(['date','id'])
print (tmp)
                V1   V2
date       id          
2000-01-01 1   0.3  0.1
2000-01-02 2   0.3  0.1
2000-01-03 1   0.1  0.1

ref = pd.DataFrame({'C1':[.2,1.2],'C2':[.3,1.3], 'C250':[.1,0.0]}, index=[1,2])
ref.index.name = 'id'
print (ref)
     C1   C2  C250
id                
1   0.2  0.3   0.1
2   1.2  1.3   0.0

然后如果需要sum列:

sum1 = ref.mul(tmp['V1'], axis=0).reset_index(level=1, drop=True)
sum2 = ref.mul(tmp['V2'], axis=0).reset_index(level=1, drop=True)
print (sum1)
              C1    C2  C250
date                        
2000-01-01  0.06  0.09  0.03
2000-01-02  0.36  0.39  0.00
2000-01-03  0.02  0.03  0.01

print (sum2)
              C1    C2  C250
date                        
2000-01-01  0.02  0.03  0.01
2000-01-02  0.12  0.13  0.00
2000-01-03  0.02  0.03  0.01