2016-11-09 12 views
1

ラムダ関数を使用して行ごとの計算を行う必要があります。たとえば、「myfunc関数」を使用して、いくつかのデータフレームpython pandas - 'Series'オブジェクトには属性がありません

import pandas as pd 
import numpy as np 

def myfunc(x, y): 
    return x + y 

colNames = ['A', 'B'] 
data = np.array([np.arange(10)]*2).T 

df = pd.DataFrame(data, index=[range(0, 10)], columns=colNames) 

を作成し、これは

df['D'] = (df.apply(lambda x: myfunc(x.A, x.B), axis=1)) 

に動作しますが、この第二の場合は動作しません!

df['D'] = (df.apply(lambda x: myfunc(x.colNames[0], x.colNames[1]), axis=1)) 

エラーを与える

AttributeError: ("'Series' object has no attribute 'colNames'", u'occurred at index 0') 
私は本当にエラーを与え、これを行う方法上の任意の手がかり(リストを使用してCOLNAMESへのアクセス)は、第2のケースを使用する必要があります

?あなたがdf.apply()を使用する場合

おかげで

+2

をジャストブラケットを使用します。 'X [COLNAMES [0]]'(ドット表記とブラケットとの違いを議論し、質問がありましたが、私はそれのようにマークすることができると思います誰かがリンクを見つけることができれば複製)。 – ayhan

+0

ありがとう、それは動作します!それを答えとして書いて、それを受け入れてください! –

+0

厳密に言えば、 'x'自体から列名を取得する場合は、' x [x.index [0]] 'を使用します。 –

答えて

5

、あなたのデータフレームの各行は、パンダのシリーズとしてあなたラムダ関数に渡されます。フレームの列はシリーズのインデックスになり、series[label]を使用して値にアクセスできます。

だから、これは動作するはずです:

df['D'] = (df.apply(lambda x: myfunc(x[colNames[0]], x[colNames[1]]), axis=1)) 
+0

そして、 'x.colNames [0]'が機能しなかったのは、ドット構文の使用が非常に制限されていることです。これは通常、属性にアクセスするために使用され、パンダは列にアクセスすることを提供しますが、その属性自体は変数にはなりません。 – ayhan

関連する問題