首页 > 解决方案 > 如何有效地在具有相同索引的两个大型数据帧之间进行操作?

问题描述

我有这些数据帧(Zcp,Qp(0),Sc(0)):

         i   hs4    1995   ...        2013        2014        2015
0       004  0101   0.000  ...     0.000000    0.000000    0.000000
1       004  0102   0.000  ...     0.000000    0.000000    0.000000
2       004  0104   0.000  ...     0.000000    0.000000    0.000000
3       004  0105   1.548  ...     0.000000    0.000000    4.083000
4       004  0106  16.839  ...    38.298000   72.338000   83.931000
...     ...   ...     ...  ...          ...         ...         ...
225765  894  9702   0.000  ...    12.961000    0.000000    0.000000
225766  894  9703   9.173  ...    17.804779   13.400000   16.979594
225767  894  9704   0.000  ...     0.000000   36.000000    0.000000
225768  894  9705  42.241  ...  1224.378276  164.680333  435.218955
225769  894  9706   0.000  ...   113.253000   18.656000    0.000000

      hs4      1995      1996   ...     2013      2014      2015
0     0101  3.811149  3.780993  ...  3.781750  3.757388  3.755313
1     0102  3.788707  3.859526  ...  3.568241  3.618460  3.594909
2     0103  4.021830  4.014036  ...  3.901071  3.902159  3.879100
3     0104  3.580394  3.553510  ...  3.745742  3.761684  3.840236
4     0105  3.717383  3.734866  ...  3.731004  3.686321  3.654970
...    ...       ...       ...  ...       ...       ...       ...
1236  9702  3.886697  4.089046  ...  3.913331  3.914801  3.973163
1237  9703  3.725988  3.749821  ...  3.710488  3.673745  3.790359
1238  9704  3.620836  3.612135  ...  3.692998  3.684579  3.635194
1239  9705  3.656766  3.696438  ...  3.621836  3.604557  3.578214
1240  9706  3.782179  3.840093  ...  3.732887  3.682156  3.729555

      i      1995      1996    ...     2013      2014      2015
0    004  2.498013  2.709929   ...  3.251985  3.220664  3.222372
1    008  3.812630  4.111502   ...  3.683572  3.881263  4.087454
2    012  1.521194  1.565437   ...  1.206792  1.315348  1.383676
3    016 -0.000000 -0.000000   ...  2.604784  2.631275  2.639739
4    020  3.729594  3.946768   ...  2.133141  1.869886  3.441653
..   ...       ...       ...   ...       ...       ...       ...
219  876  2.278855  2.578395   ...  2.224869  1.905085  2.255480
220  882  0.868912  1.464654   ...  2.585345  3.209558  2.745666
221  887  0.698383  0.746020   ...  1.751111  1.761297  2.287436
222  891  4.737027  5.155827   ... -0.000000 -0.000000 -0.000000
223  894  1.620051  1.988590   ...  2.309357  1.737125  1.992602

我代表国家(c),hs4 代表产品(p),从 1995 年到 2015 年,每年都有这些值。我要做的是:

公式

我刚开始是因为我找不到一种有效且快速的方法来为 i 和 hs4 关联相同的代码并执行我需要的操作。我在这种模式下尝试过,但它真的太慢了​​,它只用于乘法和求和:

for row1 in df.itertuples(index=False):
    for row2 in q.itertuples(index=False):
    datas1 = df.loc[row1._2:row1._22]
    datas2 = q.loc[row2._1:row2._21]
    if row1.hs4==row2.hs4:
        df.loc[row1._2:row1._22]=datas1*datas2
        Df = df.groupby(['i']).agg(np.sum).reset_index()

(随着 df.itertuples '1995'...'2015' 变成 '_2'...'_22',不知道为什么)。然后我应该用对数进行除法和求和,也许每个周期都更新 Qp 和 Sc。我在网上搜索了一些帮助,但没有找到正确的答案。

标签: pythonpandasdataframeiteration

解决方案


推荐阅读