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