【问题标题】:Make new column by turning each row into a dict in a pandas dataframe通过将每一行转换为熊猫数据框中的字典来创建新列
【发布时间】:2020-05-01 05:26:52
【问题描述】:

所以我从以下 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'


【问题讨论】:

  • 假设你的数据框是df,并且你创建了一个myModel类的对象,比如m = myModel(),你不能简单地创建一个列future_income作为-df['future_income'] = df.apply(lambda row: m.predictFinalIncome(n, row), axis=1) ?这里,apply 函数中的row 充当了 Person 对象,因此可能不需要 Person 类。

标签: python pandas numpy class oop


【解决方案1】:

我认为你只是让它变得非常复杂,你所做的所有计算实际上可以通过一个函数完成,除非你需要你的中间结果用于其他用途。

您可以创建一个可应用于数据框每一行的函数:

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)

【讨论】:

  • 好的,这很可靠;除了我需要该函数存在于类中,用于其他用途。那么有没有办法可以在 apply 中引用类函数?
  • 你还想保留哪个类,Model 还是 Person?我看不出有 Person 类的原因,但是您当前的 Model 类使用 Person 类,所以我不确定您希望它如何工作。
  • 我明白了;好的,我澄清了上面的问题;你是对的,我不需要 Person 只是 myModel。 myModel 有参数,所以我将它保存到一个对象并运行,但是我得到一个错误。此函数必须存在于 myModel 类中
  • @JohnnyThomas 你的参数顺序错误,r 先出现,然后n
  • 我的代码是反过来写的,所以我必须把 n 放在第一位。我们可以按照您的方式进行演示。我认为当使用特定的偏差值时,困境正在出现。当我指定偏差值时,您的代码会产生与我相同的错误。 model = myModel( { "gender": False, "ethnic": False })如果不是这样,我想我们会一帆风顺
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 2017-12-12
  • 2018-11-25
  • 1970-01-01
  • 2018-07-14
  • 2019-05-07
  • 2016-09-06
相关资源
最近更新 更多