python - 有选择地乘以 pandas DataFrame 值的更简洁的方法
问题描述
给定这个例子:
from pandas import DataFrame, isna
from numpy import nan
df = DataFrame([
{'id': '1', 'x': 2, 'y': 3, 'z': 4},
{'id': '5', 'x': 6, 'y': 7, 'z': 8},
{'id': '9', 'x': 10, 'y': 11, 'z': 12}
]).set_index('id')
factors = DataFrame([
{'id': '5', 'x': nan, 'z': 3},
{'id': '9', 'x': 0.2, 'z': nan},
]).set_index('id')
for row_id in factors.index:
for col in factors.columns:
if not isna(factors[col][row_id]):
df[col][row_id] *= factors[col][row_id]
中的值df
乘以来自的非 NaN 值factors
,是否有更清洁的方法来执行此操作pandas
?(或numpy
就此而言)我看了看.mul()
,但这似乎不允许我做这里需要的事情。
此外,如果 factor 包含带有id
不在的行df
,例如:
factors = DataFrame([
{'id': '5', 'x': nan, 'z': 3},
{'id': '13', 'x': 2, 'z': 4},
]).set_index('id')
解决方案
如果我正确理解您的问题,您可以使用.update
+ .mul
:
df.update(df.mul(factors))
印刷:
x y z
id
1 2.0 3 4.0
5 6.0 7 24.0
9 2.0 11 12.0
对于第二个示例(如果因子包含 id 不在 df 中的行),则打印:
x y z
id
1 2 3 4.0
5 6 7 24.0
9 10 11 12.0
推荐阅读
- scala - Scala,将列表映射到稀疏向量
- blueprism - 启动过程在 Blue Prism 中的作用不同
- javascript - 如何编写 reg 表达式以用特定格式替换价格值
- java - Ehcache: unexpected behavior when evicting cache elements
- r - 如何将 Postman 的 POST 请求转换为 R 中的 httr:POST
- javascript - 如何在表单中同时在@onsubmit 上运行功能?
- sql - BigQuery Standard SQL 中的组内组
- android - 1.12更新后如何更换AndroidTouch+Keyprocessor(FlutterView弃用)
- javascript - 正确使用 React hooks + WebSockets
- listview - 对于绑定的列表视图,如何为 selectefd 行绑定行图标