我有极端慢代码:
名为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小时后杀了应用程序......
答案 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