2017-09-11 14 views
0

各DataFramesに適用して列名をクリーンアップできる関数を作成したいとします。例えば関数を使用してPandas DataFrameの列名を変更する

:私は、コード使用して、それを適用するときに

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で私はラムダ関数としてこの単純な例を行うことができますが、私は複数のステップでより複雑な関数を持つことを計画していますので、ユーザー定義関数で列名を参照できるようにする必要があります。私はapplyがオブジェクトをシリーズとして扱うことを知っています。だから、私はどのようにユーザー定義関数内の列を参照できますか?または、問題は私がDataFrameに関数を適用している方法であるかもしれません。

+1

'df'のサンプルを追加できますか?だから私たちはあなたが得ているエラーを再現することができます。 – Dark

答えて

0

代わりにこれを試してみてください:

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) 

あなたはどちらか、単に名前を変更したデータフレームを返すために、このテンプレートを展開することができ、またはそれを返す前にデータフレームに適用する複数の機能を渡します。

+0

これは機能し、私のより複雑な機能でも動作します。ありがとう – Amber

+0

Downvoted。カラム名を変更するための慣用的な方法があり、複雑な名前変更を行う関数を渡すことができる 'rename'メソッドを使用しています。 –

+0

@TedPetrou、確かに、 'rename'はこの場合に働きます(主な効果は' inplace'の割り当てです)。しかし、これは詳細なものであり、基本的な質問ではありません。 OPは、後続のDF操作で名前を変更した列を使用する前に、関数内で列名を変更する方法を求めました。 – cmaher

0

これを行う簡単な方法の1つはrenameメソッドです。 columnsパラメータに関数を渡すことができ、この関数は各列名に適用されます。関数内のxは文字列であるため、文字列メソッドを直接使用できます。

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

df.rename(columns=standardize_headers) 

apply関数は、各列の値をSeriesとして直接使用します。

+0

質問では、これはラムダ関数として機能すると述べました。しかし、私はそれをより複雑にしたいのでユーザ定義関数であることが必要でした。 – Amber

+0

それをユーザ定義関数にしてください。他の答えはあまり良くありません。 –

+0

'inplace = True'を追加するか、' df'に戻したいと思うでしょう。 – cmaher

関連する問題