You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用其他列数值的公式更新Pandas DataFrame的income列?

解决投资数据集年度收益字段更新问题

问题背景

你有一份投资数据集,包含value(投资价值)、coupon(票面利率)、income(年度收益)三个字段,无意义的单元格用短横线-填充而非空值。需要实现的逻辑是:当coupon为有效数值,但income为无效值时,将income更新为(coupon * value)/100;其他情况保持原数据不变。

示例数据集:

import pandas as pd
import numbers

data = {'value':[100, 150, 200, 250], 'coupon':[3,'-',4,5], 'income':[3,'-',8,'-']}
df = pd.DataFrame(data)

其中仅最后一行的income需要更新为12.5,其余行无需改动。

解决方案

你编写的filler函数逻辑正确,但直接应用到DataFrame需要先处理数据格式问题,再选择合适的批量处理方式,以下是两种可行方案:

方案1:结合apply方法与数据清洗

先将数据中的-转换为pandas可识别的无效值NaN,再逐行调用函数处理:

import pandas as pd
import numbers

data = {'value':[100, 150, 200, 250], 'coupon':[3,'-',4,5], 'income':[3,'-',8,'-']}
df = pd.DataFrame(data)

# 将'-'替换为NaN,方便后续空值判断
df = df.replace('-', pd.NA)

def filler(row):
    value = row['value']
    coupon = row['coupon']
    income = row['income']
    # 判定条件:coupon为有效数值且income无效
    if pd.notna(coupon) and isinstance(coupon, numbers.Number) and pd.isna(income):
        return (coupon * value)/100
    else:
        # 原数据有效则返回原值,无效则转回'-'
        return income if pd.notna(income) else '-'

# 应用函数到每一行,更新income列
df['income'] = df.apply(filler, axis=1)
print(df)

运行后输出结果:

value coupon income
0    100      3      3
1    150      -      -
2    200      4      8
3    250      5    12.5

方案2:向量化操作(更适合大数据集)

对于大规模数据,向量化操作比逐行apply效率更高,无需循环处理:

import pandas as pd

data = {'value':[100, 150, 200, 250], 'coupon':[3,'-',4,5], 'income':[3,'-',8,'-']}
df = pd.DataFrame(data)

# 将coupon和income转换为数值型,无法转换的自动变为NaN
df['coupon'] = pd.to_numeric(df['coupon'], errors='coerce')
df['income'] = pd.to_numeric(df['income'], errors='coerce')

# 筛选需要更新的行:coupon不为空且income为空
update_mask = df['coupon'].notna() & df['income'].isna()
# 批量计算并更新符合条件的income值
df.loc[update_mask, 'income'] = (df.loc[update_mask, 'coupon'] * df.loc[update_mask, 'value']) / 100

# 将NaN转回'-',还原数据格式
df = df.fillna('-')
print(df)

该方案最终输出与方案1一致,但处理速度更快。

关键注意点

  • 先处理-:由于-是字符串类型,无法直接判断是否为有效数值,需先转换为NaN或数值型,才能进行后续的空值与类型判断。
  • 空值判断优化:使用pandas自带的pd.notna()和pd.isna()方法,比直接用isinstance更适配DataFrame的数据结构,避免判断错误。

内容的提问来源于stack exchange,提问作者Tom Hughes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:52:53