Лямбда и список понимания в этом уравнении - PullRequest
0 голосов
/ 13 марта 2019

Я создал набор данных, как показано ниже.

train  = pd.DataFrame({'id':[1,2,4],'features':[["A","B","C"],["A","D","E"],["C","D","F"]]})

Когда я выполняю строку ниже:

train['features_t'] = train["features"].apply(lambda x: " ".join(["_".join(i.split(" ")) for i in x]))

Это дает хороший результат.

0    A B C
1    A D E
2    C D F

Тем не менее, мне довольно любопытно, какая функция применяется. Он в основном выполняет итерацию значений в столбце функций кадра данных поезда. После этого он разделяет A, B, C и присоединяется обратно без разделителя. Но когда я пытался выполнить шаг за шагом, я получаю сообщение об ошибке в функции split.

Я попытался создать цикл for, затем разделить функцию и функцию соединения, но не удалось.

   for x in train['feature']:
      a = x.split(" ")
    ............................

Это дает мне это

    'list' object has no attribute 'split'

Что может быть не так с моим пониманием этого?

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Существует дополнительный уровень зацикливания, который вы пропустили, потому что он не выполняется автоматически при вызове apply в DataFrame.Функция lambda вызывается для значений, которые являются списками строк.Таким образом, понимание списка повторяется по этим строкам (например, 'A', затем 'B', затем 'C').Метод split вызывается для строк.

В вашей версии явного цикла вы пытаетесь вызвать split в списке.Попробуйте добавить дополнительный уровень в ваш цикл, и он должен работать:

for x in train['feature']:
    for i in x:
        a = i.split(' ') # this works

Я бы отметил, что вызовы split, за которыми сразу следует join, являются своего рода косвенным способом замены пробелов подчеркиваниемв каждой строке (их нет в ваших примерах, но, возможно, они могут быть в ваших реальных данных).Вы могли бы получить более непосредственно, используя str.replace вместо:

lambda x: " ".join([i.replace(" ", "_") for i in x])
1 голос
/ 13 марта 2019

x - список каждой строки

Если вы напечатаете его:

for x in train['features']:
    print(x)

Результат будет:

['A', 'B', 'C']
['A', 'D', 'E']
['C', 'D', 'F']

Вы можете выполнить соединение, используя:

for x in train['features']:
    a = ''.join(x)

Который напечатает: ABC ADE CDF

...