计算并添加来自参考数据框的数据
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
我有两个 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