Как установить столбцы в фрейме данных, даже если один из столбцов не существует?

#python #pandas

#python #панды

Вопрос:

Я составляю список фреймов данных из конечных точек ReST (т.Е. Из результатов json). В некоторых случаях, во время заключительных шагов, когда я устанавливаю окончательный набор столбцов, я получаю исключение KeyError.

 images_df = pd.concat(images)
images_df = images_df[list(cvpc.images_columns.keys())]
  

Я хотел бы знать, есть ли способ установить столбцы таким образом, чтобы несуществующие столбцы просто создавались с нулевыми значениями?

Я также пытался установить столбцы перед добавлением в список фреймов данных, т.е.:

 temp_df = temp_df[list(cvpc.images_columns.keys())]
images.append(temp_df)
  

Так что, если я смогу заставить столбцы «создавать», даже если они не существуют, это было бы огромной победой, поскольку более ранняя настройка столбцов может помочь сохранить окончательный список изображений минимального размера.

Вот простой пример:

 data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
df_t = pd.DataFrame(data)

final_columns = ['col_1', 'col_2', 'col_3']
df = df_t[final_columns]
  

Любые предложения будут с благодарностью приняты.

Ответ №1:

Вы можете сделать что-то вроде этого:

 import numpy as np
import pandas as pd

data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
df_t = pd.DataFrame(data)

final_columns = ['col_1', 'col_2', 'col_3']

for col in final_columns:
   if col not in df_t.columns:
      df_t[col] = np.NaN
  

Ответ №2:

вы можете создать словарь и распаковать его, используя assign для несуществующих столбцов, а затем просто нарезать столбцы, как вы сделали выше, со списком.

 import numpy as np
df = df_t.assign(**{col : np.nan for col in final_columns if col not in df_t.columns}
           )[final_columns]

print(df)

   col_1 col_2  col_3
0      3     a    NaN
1      2     b    NaN
2      1     c    NaN
3      0     d    NaN
  

Комментарии:

1. Я попробовал это, но это не сработало, когда я добрался до шага, на котором я установил окончательный набор столбцов, после выполнения вышеуказанного я затем попытался df_t = df_t[final_columns убедиться, что мой окончательный фрейм данных содержит только нужные столбцы, т. Е. Если был col_2_5, который я не хотел. Это может быть связано с тем, что я не особенно хорошо освещаю этот аспект в своем примере.

2. Я проверю еще раз, но в моем первоначальном тесте я снова получил ошибку ключа для отсутствующих столбцов, хотя первый ответ, принятый, сработал.

Ответ №3:

Я назначу пустые столбцы, заполненные значениями NaN:

 import numpy as np
import pandas as pd
data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
df_t = pd.DataFrame(data)

final_columns = ['col_1', 'col_2', 'col_3']
for x in final_columns:
  if not x in list(df_t.columns.values):
    df_t[x] = np.nan

df = df_t[final_columns]
  

Позже вы можете заполнить столбцы NaN.