从参考数据框计算并添加数据

2024-09-26 22:55:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两只熊猫。第一个包含一些我想与第二个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


Tags: 数据示例dataframeindex方式commonpddf1
1条回答
网友
1楼 · 发布于 2024-09-26 22:55:28

好吧,我做到了

我必须用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

相关问题 更多 >

    热门问题