【问题标题】:Columnwise Multiplication of Pandas Dataframe with Series (missmatched indices)Pandas Dataframe 与 Series 的按列乘法(索引不匹配)
【发布时间】:2018-06-21 23:58:41
【问题描述】:

我想使用 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

虽然列是一个系列,看起来像:

            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”时乘法有效,但这不是解决方案,因为系列的顺序可能会改变)

【问题讨论】:

  • 我无法重现该问题。可以加pandas版本和最小代码sn-p复现吗?

标签: python pandas


【解决方案1】:

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 即可获取二维numpy 数组。

编辑

所以顶部并不是你想要的。你想要一个元素乘法,但问题是你的数据框和系列的索引有不同的顺序。由于使用values 有效,那么我认为这意味着您拥有相同数量的索引并且没有索引丢失。你只需要reindex你的专栏

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

【讨论】:

  • 谢谢,但如果使用 df.values,我必须依赖列的正确顺序。如果某些列的排序不正确,则结果将没有意义。这就是我首先使用熊猫的原因
  • 我明白了,所以你想要的是元素乘法?
  • 是的,一列的每个元素(来自数据框)都应该乘以系列中的相同值(因此匹配 df-columns 和 series-index)
  • 抱歉回复晚了,我现在只有更改测试一下。这是工作。非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2016-02-28
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多