2016-11-15 3 views
1

Я использую apply на моем кадре my_df данных, как показано ниже:питон: панды применить функцию: 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:

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'], когда это действительно используя pd.Series, что соответствует column_A.

Поэтому, если вы используете следующее, это будет работать.

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

Примечание: как указано в комментарии выше, DataFrame.fillna является более подходящим для этой задачи.

 Смежные вопросы

  • Нет связанных вопросов^_^