python - 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”时,乘法有效,但这不是解决方案,因为系列的顺序可能会改变)
解决方案
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)
推荐阅读
- amazon-web-services - AWS + Cloudformation + Elasticbeanstalk
- javascript - 为力导向图创建下限(例如力导向直方图)
- hash - 如何获得与 Linux crypt 和 salt 输出相同的结果?
- python-3.x - 在 Python 中使用 BeautifulSoup 在 HTML 中的字符串
- ios - 如何将 barButtonItems 从子控制器放入 navItem?
- python - 无法使用 pyangbind json 解码器将 json 反序列化为 yang
- react-native - 将 Redux 集成到使用 react-navigation 的 React-Native 应用程序中
- apache-spark-sql - 将 Sparksql 查询转换为 Dataframe 转换
- react-native - 使用单个特定于平台的扩展同时定位 .ios.js 和 .android.js
- node.js - 无法使用 express API 和节点 JS(Angular4)将数据发布到 mongo db