#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]