Мне нужно применить очень простую функцию if / then к каждому элементу в Pandas Dataframe.

Если значение элемента any больше 0,5, мне нужно вернуть 1. В противном случае мне нужно вернуть 0.

Это казалось очень простым с лямбда-функцией, но каждый раз, когда я пытаюсь, я получаю сообщение об ошибке: 'ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()'

Пока что у меня есть:

df_new = df.apply(lambda x: 1 if x > 0.5 else 1)

Буду благодарен за любую помощь.

2
Chris 1 Сен 2020 в 23:08

2 ответа

Лучший ответ

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

df = pd.DataFrame({"A": [0.1, 0.2, 0.5, 0.6, 0.7],
                  "B": [0.75, 0.85, 0.2, 0.9, 0.0],
                  "C": [0.2, 0.51, 0.49, 0.3, 0.1]})

print(df)

      A        B       C
0   0.1     0.75    0.20
1   0.2     0.85    0.51
2   0.5     0.20    0.49
3   0.6     0.90    0.30
4   0.7     0.00    0.10

df_new = df.applymap(lambda x: 1 if x > 0.5 else 0)

print(df_new)

    A   B   C
0   0   1   0
1   0   1   1
2   0   0   0
3   1   1   0
4   1   0   0
2
HS-nebula 1 Сен 2020 в 20:25

Если это что-то двоичное, вы можете использовать следующее:

df = (df > 0.5).astype(int)

Код в круглых скобках сгенерирует фрейм данных bools, которые затем будут преобразованы в целые числа 1 и 0 (1 для True, 0 для False)

1
S.Chauhan 1 Сен 2020 в 20:11