如何用其他列的值更新数据框列?

3 投票
2 回答
34 浏览
提问于 2025-04-12 17:38

我有一份投资数据集,里面记录了投资的价值、票息率和年收入。有些投资没有产生任何收入,有些投资有票息率,但年收入没有计算出来。现在我想更新收入这一列,当票息有效但收入列没有数字时,该怎么做呢?以下是一些示例数据:

import pandas as pd
import numbers

data = {'value':[100, 150, 200, 250], 'coupon':[3,'-',4,5], 'income':[3,'-',8,'-']}

df = pd.DataFrame(data)

第0行和第2行的数据是完整的,不需要更新。第1行没有收入值,也没有票息值,所以也不需要更新。

示例数据

只有最后一行的收入值需要更新,更新为12.5。

就像我的示例数据集一样,那些没有实际数字的单元格里是有短横线的,它们并不是空的。

我写了一个函数来执行这个算法,但我不知道怎么把它应用到数据框中:

def filler(value, coupon, income):
    if ~isinstance(income, numbers.Number) and isinstance(coupon, numbers.Number):
        income = (coupon * value)/100
        return(income)
    else:
        pass

2 个回答

2

当然可以!请看下面的内容:

在编程中,我们常常会遇到一些问题,尤其是当我们在使用某些工具或库的时候。有时候,错误信息可能会让人感到困惑,不知道该如何解决。

比如说,当你在运行代码时,可能会看到一些提示,告诉你哪里出错了。这些提示就像是程序在跟你说:“嘿,这里有个问题!”

有时候,解决问题的方法可能很简单,只需要检查一下你的代码,看看有没有拼写错误,或者是不是漏掉了某个重要的部分。

另外,网络上有很多人也在讨论这些问题,你可以去像StackOverflow这样的地方寻找答案。那里有很多经验丰富的程序员,他们会分享自己的解决方案和经验。

总之,遇到问题时不要慌张,仔细查看错误信息,查找资料,通常都能找到解决办法。

import pandas as pd
import numbers

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

def filler(value, coupon, income):
    if not isinstance(income, numbers.Number) and isinstance(coupon, numbers.Number):
        income = (coupon * value) / 100
        return income
    else:
        return income

df['income'] = df.apply(lambda row: filler(row['value'], row['coupon'], row['income']), axis=1)

print(df)
3

你不应该使用循环,也不要用-来表示缺失值。

-去掉,改用NaNs(表示缺失值),并且让你的代码更简洁:

df[['coupon', 'income']] = df[['coupon', 'income']].apply(pd.to_numeric, errors='coerce')

df['income'] = df['income'].fillna(df['coupon'].mul(df['value']).div(100))

输出结果:

   value  coupon  income
0    100     3.0     3.0
1    150     NaN     NaN
2    200     4.0     8.0
3    250     5.0    12.5

撰写回答