在Pandas中添加新的DataFrame列不起作用

2024-05-29 01:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个熊猫数据框,其中包含了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'

抱歉,这有点长,这是我在这里的第一篇文章,但如果你有一个解决方案,我非常渴望学习


Tags: 数据lambda函数dfifabnanelse
3条回答

由于字符串格式不正确,format_df(df)函数当前正在遍历每个函数,并将每个函数的结果保存到同一列“func”。您需要使用“f-string”更新函数的最后一行(将f放在字符串之前),以便在运行时对其进行格式化

def format_df(df):
    for func in stat_functions:
        df[f'func[0]'] = df.apply(func[1], axis=1)

您不需要使用apply,您可以直接对pandas中的列执行以下操作:

df['pa'] = df['AB'] + df['BB'] + df['HBP'] + df['SH'] +df['SF']
df['obp'] = (df['H']+ df['BB']+df['HBP'])/df['PA']
df['avg'] = df['H']/df['AB']

在df中创建新列时,需要正确使用func项的label元素

像这样:

for func in stat_functions: 
    df[func[0]] = df.apply(func[1], axis=1)

请注意,在数据帧中创建新列时,此代码是如何引用func[0]的值而不是字符串'func[0]'

相关问题 更多 >

    热门问题