2016-11-15 47 views
1

私は以下のように私のデータフレームmy_dfapplyを使用しています:のpython:パンダは、関数を適用:InvalidIndexError

my_df['column_C'] = my_df.apply(lambda x : 'hello' if x['column_B'] is None else x['column_B']) 

私がしたい:

if x['column_B'] = None -> return 'hello' 
    if x['column_B'] != None -> return x['column_B'] 

は、それから私は、次のエラーを得た:

<ipython-input-31-aa087c9a635e> in <lambda>(x) 
----> 1 my_df['column_C'] = my_df.apply(lambda x : 'hello' if x['column_B'] is None else x['column_B']) 

/usr/local/lib/python3.4/dist-packages/pandas/core/series.py in __getitem__(self, key) 
    599   key = com._apply_if_callable(key, self) 
    600   try: 
--> 601    result = self.index.get_value(self, key) 
    602 
    603    if not is_scalar(result): 

/usr/local/lib/python3.4/dist-packages/pandas/indexes/base.py in get_value(self, series, key) 
    2187    # python 3 
    2188    if is_scalar(key): # pragma: no cover 
-> 2189     raise IndexError(key) 
    2190    raise InvalidIndexError(key) 
    2191 

IndexError: ('column_B', 'occurred at index column_A') 

私はここで間違ったことを誰かが知っていますか?

+2

なぜ:my_df ['column_C'] = my_df ['column_C']。fillna( 'hello') '? – MaxU

+0

これは確かにスマートなアプローチのおかげです!しかし、アプリケーション機能で何が間違っていたのか不思議です... – Edamame

答えて

1

axis=1を適用して、各列ではなく各行に適用する必要があります。 DataFrame.apply上のドキュメントを参照してください:それは本当にcolumn_Aに対応pd.Seriesを使っているとき

axis : {0 or 'index', 1 or 'columns'}, default 0 

* 0 or 'index': apply function to each column 
* 1 or 'columns': apply function to each row 

を現在の通話では、x['column_B']を見つけることができません。

したがって、次のコードを使用するとうまくいきます。

my_df['column_C'] = my_df.apply(lambda x : 'hello' 
           if x['column_B'] is None 
           else x['column_B'], axis=1) 

注:上記のコメントで指摘したように、DataFrame.fillnaは、このタスクに適しています。

関連する問題