python - 通过将每一行转换为熊猫数据框中的字典来创建新列
问题描述
所以我从以下 csv 创建了一个 pandas 数据框:
id age00 education marital gender ethnic industry income00
0 51.965 17 0 1 0 5 76110
1 41.807 12 1 0 0 1 43216
2 36.331 12 1 0 1 3 52118
3 56.758 9 1 1 2 2 47770
我的目标是创建一个名为future_income的新列,它获取每一行并使用我的模型计算未来收入。
这是由我在下面创建的类中的predictFinalIncome变量完成的:
class myModel:
def __init__(self, bias) :
self.bias = bias # bias is a dictionary with info to set bias on the gender function and the ethnic function
def b_gender(self, gender):
effect = 0
if (self.bias["gender"]): # if there is gender bias in this model/world (from the constructor)
effect = -0.0005 if (gender<1) else 0.0005 # This amount to 1.2% difference annually
return self.scale * effect
def b_ethnic(self, ethnic):
effect = 0
if (self.bias["ethnic"]): # if there is ethnic bias in this model/world (from the constructor)
effect = -0.0007 if (ethnic < 1) else -0.0003 if (ethnic < 2) else 0.0005
return self.scale * effect
# other methods/functions
def predictGrowthFactor( self, person ): # edited
factor = 1 + person['education'] + person['marital'] + person['income'] + person['industry']
return factor
def predictIncome( self, person ): # perdict the new income one MONTH later. (At least on average, each month the income grows.)
return person['income']*self.predictGrowthFactor( person )
def predictFinalIncome( self, n, person ):
n_income = self.predictIncome( person )
for i in range(n):
n_income = n_income * i
return n_income
在这种情况下,n 是 120。
所以简而言之。我想取出每一行,将其放入名为predictFinalIncome的类函数中,并在我的 df 上有一个名为 future_income 的新变量,这是他们在 120 个月内的收入。
编辑:
我实际上不需要 person 类。我不小心在确定参数“偏差”的类中删除了我的 init__ 。相反,基于@Cavin Dsouza 的代码。但这不起作用。
然后读取代码,如下所示:
utopModel = myModel( { "gender": False, "ethnic": False } ) # no bias
n =120
#Utopia
u = utopModel
world1['incomeFinal_utop'] = world1.apply(lambda row: u.predictFinalIncome(n, row), axis=1)
所以当它进入 predictFinalIncome 时,错误是这样的:
TypeError: 'str' object cannot be interpreted as an integer
During handling of the above exception, another exception occurred:
KeyError
KeyError: 'income'
解决方案
我认为你只是让它变得非常复杂,你所做的所有计算实际上都可以通过一个函数来完成,除非你需要你的中间结果用于其他用途。
您可以创建一个可应用于数据框每一行的函数:
def predictFinalIncome(row, n):
factor = 1 + row['education'] + row['marital'] + row['income'] + row['industry']
n_income = row['income'] * factor
for i in range(n):
n_income = n_income * i
return n_income
然后,使用df.apply
:
df.apply(lambda r: predictFinalIncome(r, 120), axis=1)
它返回 0,因为当你这样做时for i in range(n)
,你实际上是从 0 开始的,所以结果总是 0。你需要修复它。
更新:使函数存在于Model
类中
从您的帖子中,我没有看到此函数存在于模型中的明显原因,特别是此函数不使用任何其他方法,也没有使用您创建的偏差属性,但它就是这样。
class myModel:
def __init__(self, bias) :
self.bias = bias
def predictFinalIncome(self, row, n):
factor = 1 + row['education'] + row['marital'] + row['income'] + row['industry']
n_income = row['income'] * factor
for i in range(n):
n_income = n_income * i
return n_income
# to use:
model = myModel(bias)
df.apply(lambda r: model.predictFinalIncome(r, 120), axis=1)
推荐阅读
- teradata - 如何检查 Teradata 中的列是 CASESPECIFIC 还是 NOT CASESPECIFIC
- vue.js - Vue v-model 命名最佳实践
- python - spaCy中的token和span(来自文档的切片)有什么区别?
- java - Java Spark获取kafka解析json
- ssl - WebSocket 握手:意外的响应代码:200 - React 客户端
- python - Python datetime.datetime 不在 pandas._libs.tslibs.timestamps.Timestamp 系列中
- stm32 - STM32 Nucleo F103RB:LD1 使用外部电源缓慢闪烁
- jenkins - 如何通过更改 Jekinsfile 配置推送到 Gitlab 后自动进行版本控制
- python - 使用 Request 发送内容类型为 application/xml 的文件
- html - html 视频中的加载数据触发得太快了