Лямбда-ошибка Python 3: Истинное значение Серии неоднозначно

1

Я получаю эту ошибку: The truth value of a Series is ambiguous в моей лямбда-функции. Я знаю, что здесь очень подробное объяснение этой ошибки, но я не думаю, что это относится к моей проблеме: значение истины серии неоднозначно. Используйте команды a.empty, a.bool(), a.item(), a.any() или a.all()

В основном я пытаюсь определить через лямбда, является ли OpenBal одинаковым от одного месяца к следующему в пределах одного и того же идентификатора учетной записи и дает мне "1", если это то же самое (например, для OpenBal = 101 ниже). Очевидно, первая запись должна дать мне NaN. (PS благодарит @jdehesa за ваши ответы в другом сообщении).

Это демонстрирует мою проблему:

import pandas as pd
df = pd.DataFrame({'AccountID': [1,1,1,1,2,2,2,2,2],
                   'RefMonth':    [1,2,3,4,1,2,3,4,5],
                   'OpenBal':    [100,101,101,103,200,201,202,203,204]})
SameBal = df.groupby('AccountID').apply(lambda g: 1 if g['OpenBal'].diff() == 0 else 0)
df['SameBal'] = SameBal.sortlevel(1).values
Теги:
pandas
python-3.x
truthiness

2 ответа

1
Лучший ответ

Ваша ошибка правильно указывает, что вы не можете проверить правдивость серии. Но пользовательские анонимные функции не нужны для этой задачи.

Использование groupby + transform с pd.Series.diff:

import pandas as pd

df = pd.DataFrame({'AccountID': [1,1,1,1,2,2,2,2,2],
                   'RefMonth':    [1,2,3,4,1,2,3,4,5],
                   'OpenBal':    [100,101,101,103,200,201,202,203,204]})

df['A'] = (df.groupby('AccountID')['OpenBal'].transform(pd.Series.diff)==0).astype(int)

print(df)

   AccountID  OpenBal  RefMonth   A
0          1      100         1   0
1          1      101         2   0
2          1      101         3   1
3          1      103         4   0
4          2      200         1   0
5          2      201         2   0
6          2      202         3   0
7          2      203         4   0
8          2      204         5   0

Если вам нужна NaN для первой строки каждой группы:

g = df.groupby('AccountID')['OpenBal'].transform(pd.Series.diff)
df['A'] = (g == 0).astype(int)
df.loc[g.isnull(), 'A'] = np.nan

print(df)

   AccountID  OpenBal  RefMonth    A
0          1      100         1  NaN
1          1      101         2  0.0
2          1      101         3  1.0
3          1      103         4  0.0
4          2      200         1  NaN
5          2      201         2  0.0
6          2      202         3  0.0
7          2      203         4  0.0
8          2      204         5  0.0
  • 0
    Красиво сделано! @ Диллон, мне может понадобиться твоя пользовательская функция для аналогичной задачи, так что спасибо также ...
  • 0
    @Givenx Этот ответ не показывает NaN в соответствии с вопросом: «Очевидно, первая запись должна дать мне NaN»
Показать ещё 1 комментарий
1

1 if g['OpenBal'].diff() == 0 не работает. Это не может работать объект pd.Series()

Вам необходимо создать подходящий метод:

def convert(a):
    return np.array([1 if i==0 else np.nan if pd.isnull(i) else 0 for i in a])

Это решит ваше The truth value of a Series is ambiguous ошибка

SameBal = df.groupby('AccountID').apply(lambda g: pd.Series(data=convert(g['OpenBal'].diff().values), index=g['RefMonth']))
SameBal.name = 'SameBal'

SameBal 
Out[]:
AccountID  RefMonth
1          1           NaN
           2           0.0
           3           1.0
           4           0.0
2          1           NaN
           2           0.0
           3           0.0
           4           0.0
           5           0.0

df.merge(SameBal.reset_index())
Out[]:
   AccountID  OpenBal  RefMonth  SameBal
0          1      100         1      NaN
1          1      101         2      0.0
2          1      101         3      1.0
3          1      103         4      0.0
4          2      200         1      NaN
5          2      201         2      0.0
6          2      202         3      0.0
7          2      203         4      0.0
8          2      204         5      0.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню