繁体   English   中英

Pandas:将从 DataFrame 中提取的值乘以另一个 DataFrame 中的列值

[英]Pandas: Multiplying a value extracted from a DataFrame to column values in another DataFrame

我有的:

我有两个数据框。 第一个df1包含笛卡尔坐标和与某些元素相关的一些值。 它看起来像这样:

           X           Y   Zn  Pb    Ag  Cu  Mo   Cr  Ni  Co   Ba
0  431434.79  3305001.94   87   7  0.02  42   2   57  38  14  393
1  432522.60  3298058.43   70   6  0.02  56   2   27  29  20  404
2  438045.35  3291987.05   75   5  0.02  69   2   44  23  17  417
3  436260.76  3294412.90   70   6  0.02  54   1   20  19  12  377
4  439294.48  3297653.81  168  14  0.02  27   2   31  18  14  277
5  441406.54  3298650.88   87  11  0.02  37   2   25  28  14  797
6  431189.97  3315353.72  113  11  0.02  40   1  110  36  13  361
7  428527.24  3315392.79  133   9  0.02  45   2   73  42  16  414
8  430881.58  3316951.45  144   8  0.02  58   1   83  39  21  617
9  427968.68  3317058.60  267  11  0.02  37   1  285  43  17  292

现在,我有另一个 DataFrame, df2 ,其中包含一些计算。 它看起来像这样:

    Prediction Rate (%)  Occupied Area (%)  Normalized Density    Weight
Zn                   50                 50                1.00  0.000000
Pb                   50                 50                1.00  0.000000
Ag                   78                 22                3.55  1.266948
Cu                   90                 10                9.00  2.197225
Mo                   79                 21                3.76  1.324419
Cr                   69                 31                2.23  0.802002
Ni                   81                 19                4.26  1.449269
Co                   70                 30                2.33  0.845868
Ba                   79                 21                3.76  1.324419

很明显, df2的索引与df1的某些列相同。

我想要的是:

现在我想将df2中每个元素的权Weight乘以df1中每个元素的相应列。 例如, Zn的权重为0 我想将0乘以df1中的所有Zn值。 它基本上是一列零。 我想对所有列进行迭代。

到目前为止我做了什么:

我已经从df2中提取了Weights列。 然后我尝试通过乘法创建一个新的 DataFrame。

# list of each element
elements = ['Zn', 'Pb', 'Ag', 'Cu', 'Mo', 'Cr', 'Ni', 'Co', 'Ba']

# extracting "Weight" column from df2
weights_extracted = df1["Weight"]

# creating a new dataframe and multiplying values of each element with their corresponding weight
new_df = pd.DataFrame()
for i,element in enumerate(elements):
    df2[element] = df2[element] * weights_extracted.loc[element,:]
            
new_df = new_df.append(raw_data,False)

问题:

我收到此错误:

Too many indexers

我该如何解决这个问题?

您可以使用df2的索引在df1中选择所需的列,然后将这些列与df2中的相应权Weightmultiply

df1.update(df1[df2.index].mul(df2['Weight']))

print(df1)

           X           Y   Zn   Pb        Ag          Cu        Mo          Cr         Ni         Co           Ba
0  431434.79  3305001.94  0.0  0.0  0.025339   92.283450  2.648838   45.714114  55.072222  11.842152   520.496667
1  432522.60  3298058.43  0.0  0.0  0.025339  123.044600  2.648838   21.654054  42.028801  16.917360   535.065276
2  438045.35  3291987.05  0.0  0.0  0.025339  151.608525  2.648838   35.288088  33.333187  14.379756   552.282723
3  436260.76  3294412.90  0.0  0.0  0.025339  118.650150  1.324419   16.040040  27.536111  10.150416   499.305963
4  439294.48  3297653.81  0.0  0.0  0.025339   59.325075  2.648838   24.862062  26.086842  11.842152   366.864063
5  441406.54  3298650.88  0.0  0.0  0.025339   81.297325  2.648838   20.050050  40.579532  11.842152  1055.561943
6  431189.97  3315353.72  0.0  0.0  0.025339   87.889000  1.324419   88.220220  52.173684  10.996284   478.115259
7  428527.24  3315392.79  0.0  0.0  0.025339   98.875125  2.648838   58.546146  60.869298  13.533888   548.309466
8  430881.58  3316951.45  0.0  0.0  0.025339  127.439050  1.324419   66.566166  56.521491  17.763228   817.166523
9  427968.68  3317058.60  0.0  0.0  0.025339   81.297325  1.324419  228.570570  62.318567  14.379756   386.730348

在 for 循环中 'i' var 不是必需的,您使用的 var 是 'element'。

说“谢谢”是值得赞赏的,但这并不能回答问题。 相反,请投票选出对您最有帮助的答案! 如果这些答案对您有帮助,请考虑以更具建设性的方式表示感谢——通过对您的同行在这里提出的问题贡献您自己的答案。

为了可读性,我会使用 numpy 而不是 pandas 来解决这个问题。 所以我会推荐这个

elements = ['Zn', 'Pb', 'Ag', 'Cu', 'Mo', 'Cr', 'Ni', 'Co', 'Ba']
df1_matrix = df1[elements].to_numpy()
df2_matrix = df2['Weight'].to_numpy()
multiplied = df1_matrix * df2_matrix
new_df = pd.DataFrame(multiplied,columns=elements)

这使得问题变成了一个相对简单的矩阵问题,而不是处理索引和 for 循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM