我想应用自定义函数并创建一个名为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'功能正常吗?
答案 0 :(得分:8)
Apply会沿着整个行传递,轴= 1。假设您的两列名为initial_pop
和growth_rate
def final_pop(row):
return row.initial_pop*math.e**(row.growth_rate*35)
答案 1 :(得分:5)
你快到了那里:
facts['pop2050'] = facts.apply(lambda row: final_pop(row['population'],row['population_growth']),axis=1)
使用lambda可以保留函数中列出的特定(有趣)参数,而不是将它们捆绑在“行”中。
答案 2 :(得分:3)
您可以在不需要DataFrame.apply()
的情况下获得相同的结果。 Pandas系列(或数据帧列)可以用作NumPy函数的直接参数,甚至是内置的Python运算符,它们是按元素应用的。在您的情况下,它就像以下一样简单:
import numpy as np
facts['pop2050'] = facts['population'] * np.exp(35 * facts['population_growth'])
这会将列population_growth
中的每个元素相乘,将numpy的exp()
函数应用于该新列(35 * population_growth
),然后将结果与population
相加。
答案 3 :(得分:2)
您的功能
def function(x):
// your operation
return x
调用您的函数,
df['column']=df['column'].apply(function)