Лямбда-функция внутри карты панд - PullRequest
0 голосов
/ 12 мая 2018

Я не могу понять структуру этого, если еще, если еще в лямбда-функции, определенной ниже.В частности - часть:

if x != x

В этом коде:

check['Id'].map(lambda x: x if x != x else (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x))

PS: я получаю, что приведенный выше код форматирует значение идентификатора и возвращает строку без десятичной дроби, которая может быть тамна входе.

1 Ответ

0 голосов
/ 12 мая 2018

Я думаю, что это для работы с NaN s, потому что:

np.nan != np.nan

, поэтому, если NaN s, он возвращает NaN s, иначе обрабатывает строки.

Пример:

check = pd.DataFrame({'Id':[np.nan, '0909.0', '023', '09.06']})

a = check['Id'].map(lambda x: x if x != x else (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x)))
print (a)
0     NaN
1    0909
2     023
3      09
Name: Id, dtype: object

Если его опустить, это работает, потому что выполняется преобразование в строки, но первое значение не np.nan, а строка nan:

a = check['Id'].map(lambda x: (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x)))
print (a)
0     nan
1    0909
2     023
3      09
Name: Id, dtype: object

Если все значения являются строками сNaN s и удалить преобразование в строки:

a = check['Id'].map(lambda x: ((x)[:(x).rfind('.0')] if (x).rfind('.0') != -1 else (x)))
print (a)

AttributeError: у объекта 'float' нет атрибута 'rfind'

a = check['Id'].map(lambda x: x if x != x else ((x)[:(x).rfind('.0')] if (x).rfind('.0') != -1 else (x)))
print (a)
0     NaN
1    0909
2     023
3      09
Name: Id, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...