计算并添加来自参考数据框的数据

Calculate and add up Data from a reference dataframe

我有两个 pandas 数据帧。第一个包含一些我想与第二个数据帧相乘的数据,它是一个参考 table.

因此,在我的示例中,我想在 df1 中为我的参考 table 中的每一列获取一个新列 - 但还要将该列中的每一行相加。 像这样(索引 205368421,R21 17):(1205 * 0.526499) + (7562* 0.003115) + (1332* 0.000267) = 658

在 Excel VBA 中,我遍历了两个 table 并这样做了 - 但花了很长时间。我已经读到 pandas 在没有迭代的情况下更好。

df1 = pd.DataFrame({'Index': ['205368421', '206321177','202574796','200212811', '204376114'], 
              'L1.09A': [1205,1253,1852,1452,1653],
              'L1.10A': [7562,7400,5700,4586,4393],
              'L1.10C': [1332, 0, 700,1180,290]})

df2 = pd.DataFrame({'WorkerID': ['L1.09A', 'L1.10A', 'L1.10C'], 
              'R21 17': [0.526499,0.003115,0.000267],
              'R21 26': [0.458956,0,0.001819]})
Index      1.09A L1.10A L1.10C
205368421  1205  7562   1332
206321177  1253  7400   0
202574796  1852  5700   700
200212811  1452  4586   1180
204376114  1653  4393   290

WorkerID R21 17   R21 26
L1.09A   0.526499 0.458956
L1.10A   0.003115 0
L1.10C   0.000267 0.001819

我想要这个:

Index       L1.09A  L1.10A  L1.10C  R21 17  R21 26
205368421   1205    7562    1332    658     555
206321177   1253    7400    0       683     575
202574796   1852    5700    700     993     851
200212811   1452    4586    1180    779     669
204376114   1653    4393    290     884     759

我会接受一些提示。就像有人告诉我的那样,这可能是矩阵乘法。所以 .dot() 会有所帮助。这是正确的方向吗?

编辑: 我现在完成了以下操作:

df1 = df1.set_index('Index')
df2 = df2.set_index('WorkerID')

common_cols = list(set(df1.columns).intersection(df2.index))
df2 = df2.loc[common_cols]

df1_sorted = df1.reindex(sorted(df1.columns), axis=1)
df2_sorted = df2.sort_index(axis=0)

df_multiplied = df1_sorted @ df2_sorted

这适用于我的示例数据帧,但不适用于我的真实数据帧。 我的真实尺寸为:df1_sorted(10429, 69)df2_sorted(69, 18)

应该可以,但我的 df_multiplied 满是 NaN。

好的,我做到了!

我不得不用 0 替换所有 nan。

所以最终的解决方案是:

df1 = df1.set_index('Index')
df2 = df2.set_index('WorkerID')

common_cols = list(set(df1.columns).intersection(df2.index))
df2 = df2.loc[common_cols]

df1_sorted = df1.reindex(sorted(df1.columns), axis=1)
df2_sorted = df2.sort_index(axis=0)

df1_sorted= df1_sorted.fillna(0)
df2_sorted= df2_sorted.fillna(0)

df_multiplied = df1_sorted @ df2_sorted