如何将自定义函数应用于每行的pandas数据框

zor*_*rny 13 python pandas

我想应用自定义函数并创建一个名为population2050的派生列,该列基于我的数据框中已存在的两列.

import pandas as pd
import sqlite3
conn = sqlite3.connect('factbook.db')
query = "select * from facts where area_land =0;"
facts = pd.read_sql_query(query,conn)
print(list(facts.columns.values))

def final_pop(initial_pop,growth_rate):
    final = initial_pop*math.e**(growth_rate*35)
    return(final)

facts['pop2050'] = facts['population','population_growth'].apply(final_pop,axis=1)
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到一个错误.我没有正确使用'apply'功能吗?

Bou*_*oud 12

Apply将沿着整个行传递,轴= 1.假设你的两列被调用initial_pop,这样调整growth_rate

def final_pop(row):
    return row.initial_pop*math.e**(row.growth_rate*35)
Run Code Online (Sandbox Code Playgroud)


小智 9

你的功能,

def function(x):
  // your operation
  return x
Run Code Online (Sandbox Code Playgroud)

将您的功能称为,

df['column']=df['column'].apply(function)
Run Code Online (Sandbox Code Playgroud)


小智 6

你几乎在那里:

facts['pop2050'] = facts.apply(lambda row: final_pop(row['population'],row['population_growth']),axis=1)
Run Code Online (Sandbox Code Playgroud)

使用lambda允许您保留函数中列出的特定(有趣)参数,而不是将它们捆绑在"行"中.


Mr.*_*art 5

您无需即可获得相同的结果DataFrame.apply()。Pandas系列(或数据框列)可用作NumPy函数的直接参数,甚至可用作内置Python运算符(直接应用于元素)。就您而言,它很简单,如下所示:

import numpy as np

facts['pop2050'] = facts['population'] * np.exp(35 * facts['population_growth'])
Run Code Online (Sandbox Code Playgroud)

这会将列中的每个元素相乘population_growth,将numpy的exp()函数应用于该新列(35 * population_growth),然后将结果与相加population