pandas ошибка в df.apply () только для указанного c фрейма данных - PullRequest
0 голосов
/ 03 августа 2020

Заметил что-то очень странное в pandas. Мой фрейм данных (с 3 строками и 3 столбцами) выглядит так:

enter image description here

When I try to extract ID and Name(separated by underscore) to their own columns using command below, it gives me an error:

df[['ID','Name']] = df.apply(lambda x: get_first_last(x['ID_Name']), axis=1, result_type='broadcast')

Error is:

ValueError: cannot broadcast result

Here's the interesting part though..When I delete the "From_To" column from the original dataframe, performing the same df.apply() to split ID_Name works perfectly fine and I get the new columns like this: введите описание изображения здесь

Я проверил много ответов SO, но, похоже, ни один из них не помогает. Что я здесь пропустил?

PS get_first_last - очень простая функция вроде этой:

def get_first_last(s):
    str_lis = s.split("_")
    return [str_lis[0], str_lis[1]]

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Из do c из pandas .DataFrame.apply :

'broadcast': результаты будут транслироваться в исходную форму DataFrame, исходный индекс и столбцы будут сохранены.

Итак, проблема в том, что исходная форма вашего фрейма данных (3, 3), а результат вашей функции apply - 2 столбца, поэтому у вас есть несоответствие . и это также объясняет, почему, когда вы удаляете "From_To", новая форма - (3, 2), и теперь у вас есть совпадение ...

Вы можете использовать 'broadcast' вместо 'expand', и вы будет ваш ожидаемый результат.

  table = [
      ['1_john', 23, 'LoNDon_paris'],
      ['2_bob', 34, 'Madrid_milan'],
      ['3_abdellah', 26, 'Paris_Stockhom']
  ]
  df = pd.DataFrame(table, columns=['ID_Name', 'Score', 'From_to'])
  df[['ID','Name']] = df.apply(lambda x: get_first_last(x['ID_Name']), axis=1, result_type='expand')

надеюсь, что это поможет !!

0 голосов
/ 03 августа 2020

Это определенно не лучший вариант использования apply, вам лучше сделать:

df[["ID", "Name"]]=df["ID_Name"].str.split("_", expand=True, n=1)

Что для ваших данных будет выводиться (я взял только первые 2 столбца из вашего фрейма данных):

   ID_Name  Score ID   Name
0   1_john     23  1   john
1    2_bob     34  2    bob
2  3_janet     45  3  janet

Теперь n=1 на всякий случай, если у вас будет несколько _ (например, как часть имени) - чтобы убедиться, что вы вернете не более 2 столбцов (иначе приведенный выше код не сработает )

Например, если мы немного изменим ваш код, мы получим следующий результат:

    ID_Name  Score ID    Name
0    1_john     23  1    john
1  2_bob_jr     34  2  bob_jr
2   3_janet     45  3   janet
...