Как мне выяснить, что делает этот код? - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь испачкать руки, проводя некоторые эксперименты с Data Science, используя Python и библиотеку Pandas.

Недавно я взял в руки блокнот Jupyter и наткнулся на кусок код, который я не мог понять, как это работает?

Это строка

md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(lambda x: [i['name'] for i in x] if isinstance(x, list) else [])

В набор данных входит столбец жанров, который содержит пары ключ-значение, приведенный выше код удаляет ключи и заменяет все только значением, если существует более одного значения a | вставляется как разделитель между ними, например

Comedy | Действие | Драма

Я хочу знать, как на самом деле работает код! Зачем ему буквальный_евал от ast? Что делает лямбда-функция ?! Есть ли более краткий и чистый способ написать это?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Вы можете искать построчно:

md['genres'] = md['genres'].fillna('[]')  

В этой первой строке NaN ячейки заменяются строкой, представляющей пустой список. Это потому, что столбец genres должен содержать списки.

                           .apply(literal_eval)

Метод ast.literal_eval используется для фактической оценки словарей, а не для их использования в качестве строк. Благодаря этому вы можете получить доступ к ключам и значениям. Подробнее здесь .

                           .apply(
                             lambda x: [i['name'] for i in x]
                                       if isinstance(x, list) 
                                       else []
                             )

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

2 голосов
/ 03 февраля 2020

Давайте сделаем один шаг за раз:

md['genres'].fillna('[]')

Эта строка заполняет все экземпляры NA или NaN в серии с '[]'.

.apply(literal_eval)

Это относится literal_eval() из пакета ast. Из того факта, что значения NA были заменены на '[]', можно предположить, что исходная серия содержит строковые представления списков, поэтому literal_eval используется для преобразования этих строк в списки.

.apply(lambda x: [i['name'] for i in x] if isinstance(x, list) else [])

Эта лямбда-функция применяет следующую логику c: если значение является списком, сопоставьте со списком, содержащим значения ['name'] для каждого элемента в списке, в противном случае сопоставьте с пустым списком.

Результат следовательно, полной функцией является отображение каждого элемента в серии, которая в исходном DF является строковым представлением списка, в список значений ['name'] для каждого элемента в этом списке. Если элемент не является списком или NA, он отображается в пустой список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...