我想创建一个可以应用于每个数据范围的函数以清理列名。
例如:
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')
'external_code'是DF中的第一列。我知道我可以作为lambda函数做这个简单的示例,但是我计划具有多个步骤的更复杂的功能,因此我需要能够在用户定义的函数中引用列名。我知道应用将对象视为系列。那么,如何参考用户定义的功能中的列?也许问题是我将功能应用于数据框的方式。
尝试一下:
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)
您可以在此模板上扩展以简单地返回重命名的数据框架,或者传递多个功能以在返回数据框架之前应用于数据框架。
做到这一点的一种简单方法就是使用rename
方法。您可以传递columns
参数a函数,并且此函数将应用于每个列名。请注意,函数中的x
是字符串,因此您可以直接使用字符串方法。
def standardize_headers(x):
return x.replace(' ', '_').lower()
df.rename(columns=standardize_headers)
应用功能直接与每列中的值一起使用。