Как переиндексировать информационный фрейм pandas внутри функции? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь добавить заголовки столбцов с пустыми значениями в мой фрейм данных ( точно так же, как этот ответ ), но внутри функции, которая уже модифицирует его, например:

mydf = pd.DataFrame()

def myfunc(df):
  df['newcol1'] = np.nan  # this works

  list_of_newcols = ['newcol2', 'newcol3']
  df = df.reindex(columns=df.columns.tolist() + list_of_newcols)  # this does not
  return
myfunc(mydf)

Если я запускаю строки по отдельности в консоли IPython, они будут добавлены.Но, запустив скрипт, newcol1 будет добавлен, а 2 и 3 - нет.Настройка copy=False тоже не работает.Что я тут не так делаю?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Не уверен, что это была ошибка, которую вы допустили в действительном коде или когда вы набирали его здесь, но tolist() - это функция, и вы должны добавить квадратные скобки.

df = df.reindex(columns=df.columns.tolist() + list_of_newcols)
0 голосов
/ 16 января 2019

Вам не нужно устанавливать NaN значения и указывать снова метки новых столбцов. Вы можете reindex с произвольным списком строк; NaN - это значение по умолчанию, в котором данные не указаны.

df = pd.DataFrame({'A': [1, 2, 3]})

df = df.reindex(columns=['A', 'B', 'C'])

print(df)

   A   B   C
0  1 NaN NaN
1  2 NaN NaN
2  3 NaN NaN
0 голосов
/ 16 января 2019

Панды df.reindex() создает новый объект, если индексы не эквивалентны, поэтому вам нужно будет вернуть новый объект из вашей функции.

def myfunc(df):
  df['newcol1'] = np.nan  # this works

  list_of_newcols = ['newcol2', 'newcol3']
  df = df.reindex(columns=df.columns.tolist + list_of_newcols)  # this does not
  return df

mydf = myfunc(mydf)
...