如何为每一行的pandas数据框应用自定义函数

37

我想应用一个自定义函数,并创建一个名为“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)
当我运行上述代码时,出现了一个错误。我没有正确使用'apply'函数吗?
4个回答

34

你差点就到了:

facts['pop2050'] = facts.apply(lambda row: final_pop(row['population'],row['population_growth']),axis=1)

使用lambda函数可以让你将特定(有趣的)参数列在函数中,而不是将它们捆绑在一起。


29

您的函数,

def function(x):
  // your operation
  return x

将您的函数调用为:

df['column']=df['column'].apply(function)

20

如果假定你的两列分别被称为initial_popgrowth_rate,那么使用axis=1调整后,Apply将沿着整个行传递给你。

def final_pop(row):
    return row.initial_pop*math.e**(row.growth_rate*35)

这将导致:TypeError: 插入的列的索引与框架索引不兼容... - Raptor

9

不需要使用DataFrame.apply(),您也可以实现相同的结果。Pandas系列(或dataframe列)可用作NumPy函数和甚至内置Python操作符的直接参数,这些函数和操作符是逐个元素应用的。在您的情况下,只需执行以下简单操作:

import numpy as np

facts['pop2050'] = facts['population'] * np.exp(35 * facts['population_growth'])

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接