Python 2.7 使用函数修改数据帧列名

Python 2.7 使用函数修改数据帧列名,python-2.7,pandas,Python 2.7,Pandas,我想创建一个可以应用于每个数据帧的函数来清理列名 例如: def standardize_headers(df): return df.columns.str.replace(' ', '_').str.lower() 但是,当我使用代码应用它时: df2 = df.apply(standardize_headers) 我得到一个错误: AttributeError: ("'Series' object has no attribute 'columns'", u'occurred

我想创建一个可以应用于每个数据帧的函数来清理列名

例如:

def standardize_headers(df):
     return df.columns.str.replace(' ', '_').str.lower()
但是,当我使用代码应用它时:

df2 = df.apply(standardize_headers)
我得到一个错误:

AttributeError: ("'Series' object has no attribute 'columns'", u'occurred at index External_Code')
“外部_代码”是df中的第一列。我知道我可以将这个简单的示例作为lambda函数来完成,但我计划使用一个更复杂的函数,包含多个步骤,因此我需要能够在用户定义的函数中引用列名。我知道apply将对象视为一个系列。那么,如何引用用户定义函数中的列呢?或者问题在于我将函数应用于数据帧的方式。

请尝试以下方法:

def standardize_headers(df, func=None):
    df.columns = df.columns.str.replace(' ', '_').str.lower()
    if func:
      df = df.apply(func)
    return df

df2 = standardize_headers(df)

您可以在此模板上展开以简单地返回重命名的数据帧,或者在返回数据帧之前传递多个应用于该数据帧的函数。

一种简单的方法是使用
重命名方法。您可以将
columns
参数传递给函数,该函数将应用于每个列名。请注意,函数中的
x
是一个字符串,因此可以直接使用字符串方法

def standardize_headers(x):
    return x.replace(' ', '_').lower()

df.rename(columns=standardize_headers)

apply函数直接将每列中的值作为一个系列使用。

您可以添加
df
的示例吗。所以我们可以重现你所得到的错误。这是可行的,也适用于我更复杂的函数。谢谢你的投票。有一种惯用的更改列名的方法,就是使用
rename
方法,该方法可以传递一个函数来执行任何复杂的重命名。@TedPetrou,当然,
rename
在这种情况下起作用(主要好处是
inplace
赋值),但这更多的是一个细节,而不是根本问题——阅读最后一段。OP询问在后续DF操作中使用重命名列之前,如何更改函数中的列名。在问题中,我指出这是一个lambda函数。但我需要它是一个用户定义的函数,因为我想让它更复杂,只是让它成为一个用户定义的函数。另一个答案不是很好。你要添加
inplace=True
或分配回
df
@TedPetrou,你没有阅读整个问题。我需要能够引用列名。我需要对每一列应用一些不像重命名那么简单的东西。是的,您的代码解决了我提供的示例。