所以我有一个熊猫数据框,其中包含了2001年亚利桑那响尾蛇的击球统计数据。我对Python/Pandas非常陌生,所以我尝试使用类似于以下的lambda函数添加一些列
PA_lambda = lambda row: row.AB + row.BB + row.HBP + row.SH + row.SF
OBP_lambda = lambda row: (row.H + row.BB + row.HBP) / (row.PA) if row.PA > 0 else 'NaN'
AVG_lambda = lambda row: row.H / row.AB if row.AB > 0 else 'NaN'
以后,我想处理更多非常相似的数据,并且需要添加这些列,将来还要添加更多。因此,我制作了一个单独的python模块,其中包含函数、一个包含每个函数及其应具有的列名的列表,以及一个迭代列表并将列添加到数据帧末尾的函数:
import pandas as pd
PA_lambda = lambda row: row.AB + row.BB + row.HBP + row.SH + row.SF
OBP_lambda = lambda row: (row.H + row.BB + row.HBP) / (row.PA) if row.PA > 0 else 'NaN'
AVG_lambda = lambda row: row.H / row.AB if row.AB > 0 else 'NaN'
stat_functions = [['pa', PA_lambda], ['obp',OBP_lambda], ['avg', AVG_lambda]]
def format_df(df):
for func in stat_functions:
df['func[0]'] = df.apply(func[1], axis=1)
我不确定是否需要pandas模块,但每当我将模块导入Jupyter笔记本并尝试调用format_df时,只有第一个函数PA_lambda
运行,并将其保存到列标签“func”下的数据帧中。我认为创建一个包含列名和函数本身的列表是可行的,但一旦它尝试将OBP_lambda应用于df,它就会返回错误
AttributeError: 'Series' object has no attribute 'PA'
抱歉,这有点长,这是我在这里的第一篇文章,但如果你有一个解决方案,我非常渴望学习
由于字符串格式不正确,format_df(df)函数当前正在遍历每个函数,并将每个函数的结果保存到同一列“func”。您需要使用“f-string”更新函数的最后一行(将f放在字符串之前),以便在运行时对其进行格式化
您不需要使用apply,您可以直接对pandas中的列执行以下操作:
在df中创建新列时,需要正确使用func项的label元素
像这样:
请注意,在数据帧中创建新列时,此代码是如何引用
func[0]
的值而不是字符串'func[0]'
相关问题 更多 >
编程相关推荐