首页 > 解决方案 > 有选择地乘以 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')

标签: pythonpandasdataframe

解决方案


如果我正确理解您的问题,您可以使用.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

推荐阅读