我有两只熊猫。第一个包含一些我想与第二个dataframe相乘的数据,第二个dataframe是一个引用表
因此,在我的示例中,我希望在df1中为引用表中的每一列获取一个新列,但也要将该列中的每一行相加。 这样(指数205368421和R2117):(1205*0.526499)+(7562*0.003115)+(1332*0.000267)=658
在ExcelVBA中,我迭代了这两个表,并以这种方式完成了这项工作,但耗时很长。我已经读到,熊猫是更好的方式,而不是重复
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
因此,最终的解决方案是:
相关问题 更多 >
编程相关推荐