首页 > 解决方案 > Pandas Dataframe 与 Series 的列乘法(索引不匹配)

问题描述

我想使用 python 的 pandas 进行一些简单的矩阵计算,但在尝试执行以下简单乘法时遇到了一个问题:

df = df.mul(column, axis=1)

df 是一个 3x3 数据框,如下所示:

                    441090707  441090801  441090408
        441090408   0.255061   0.202650   0.689114
        441090707   0.287952   0.218351   0.116750
        441090801   0.456987   0.578998   0.194136

而 column 是一个系列,看起来像:

            area
            441090707     179.727362
            441090801     698.939741
            441090408    1377.909774
            Name: Test, dtype: float64

乘法会引发 RuntimeWarning(在 'str' 和 'int' 的实例之间不支持'<',对于不可比较的对象未定义排序顺序)并返回以下内容:

                       441090707  441090801    ...      441090801  441090408
        441090408        NaN        NaN    ...            NaN        NaN
        441090707        NaN        NaN    ...            NaN        NaN
        441090801        NaN        NaN    ...            NaN        NaN

正如文档所述“不匹配的索引将合并在一起”,所以我的索引似乎有问题。但我不知道如何使系列索引与数据框列匹配。

(当我使用“column.values”时,乘法有效,但这不是解决方案,因为系列的顺序可能会改变)

标签: pythonpandas

解决方案


Pandas 在后台使用 numpy,因此您可以简单地将它们作为矩阵相乘。使用虚拟案例:

import pandas as pd
df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]})
cl=pd.Series([1,2,3])
ans=df.values @ cl

您只需要使用values来获取 2d numpy 数组。

编辑

所以最上面的部分并不是你想要的。你想要一个元素乘法,但问题是你的数据框和系列的索引有不同的顺序。由于 usingvalues有效,那么我认为这意味着您具有相同数量的索引并且没有缺少索引。你只需要reindex你的专栏

ans=df.mul(cl.reindex(df.index).values,axis=1)

推荐阅读