Почему это делают панды.Фрейм данных.apply создает серию вместо фрейма данных

#pandas #dataframe #apply #series

Вопрос:

Я действительно не понимаю, почему из следующего кода pandas возвращает серию, а не фрейм данных.

 import pandas as pd df = pd.DataFrame([[4,9]]*3, columns = ["A", "B"])  def plus_2(x):  y =[]  for i in range(0, len(x)):  y.append(x[i] 2)  return y  df_row = df.apply(plus_2, axis = 1) # Applied to each row df_row   

В то время как если я изменю axis=0 его, он создаст фрейм данных, как и ожидалось:

 import pandas as pd df = pd.DataFrame([[4,9]]*3, columns = ["A", "B"])  def plus_2(x):  y =[]  for i in range(0, len(x)):  y.append(x[i] 2)  return y  df_row = df.apply(plus_2, axis = 0) # Applied to each row df_row   

Вот результат:

введите описание изображения здесь

Ответ №1:

В первом примере, где вы ставите ось=1, вы реализуете на уровне строк. Это означает, что для каждой строки функция plus_2 возвращает y, который является списком из двух элементов (но список в целом является одним элементом, так что это pd.Серия). На основе вашего примера будет возвращен 3-кратный список (по 2 элемента в каждом). Здесь один список, если одна строка.

Вы можете развернуть этот результат и создать два столбца (каждый элемент из списка будет новым столбцом), добавив result_type=»развернуть» в поле применить:

 df_row = df.apply(lambda x: plus_2(x), axis=1, result_type="expand")  # output   0 1 0 6 11 1 6 11 2 6 11  

При втором подходе у вас ось=0, и это применяется на уровне столбцов. Это означает, что для каждого столбца функция plus_2 возвращает y, поэтому plus_2 применяется дважды, отдельно для столбца A и для столбца B. Вот почему он возвращает фрейм данных: ваш ввод-это фрейм данных со столбцами A и B, каждый столбец применяет функцию plus_2 и возвращает столбцы A и B в результате применения функций plus_2.

На основе вашего примера будет возвращено 2 списка (по 3 элемента в каждом). Здесь единый список состоит из одного столбца.

Таким образом, основное различие между axis=1 и axis=0 заключается в том, что:

если вы подали заявку на уровне строки, приложение вернется:

 [6, 11] [6, 11] [6, 11]  

если вы подали заявку на уровне столбца, приложение вернется:

 [6, 6, 6] [11, 11, 11]