Интересно, как лучше решить эту проблему. Если у меня есть DF со следующими столбцами

df1()
type_of_fruit   name_of_fruit    price
.....           .....            .....

И список под названием

expected_cols = ['name_of_fruit','price']

Как лучше всего автоматизировать проверку df1 по списку ожидаемых_столбцов? Я пытался что-то вроде

df_cols=df1.columns.values.tolist()
if df_cols != expected_cols:

А затем попробуйте перенести в другой df любые столбцы, которых нет вожидаемых_столбцах, но мне это не кажется хорошей идеей. Есть ли способ сохранить «отброшенные» столбцы?

df2 = df1.drop(columns=expected_cols)

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

df1.reindex(columns=expected_cols)

Но немного сомнительно, как это сделать программно, а затем как справиться с проблемой, когда столбцов больше, чем ожидалось.

1
thejoker34 10 Янв 2022 в 19:19

2 ответа

Лучший ответ

Вы можете использовать set difference, используя -:

Предполагая, что df1 имеет столбцы:

In [542]: df1_cols = df1.columns # ['type_of_fruit', 'name_of_fruit', 'price']
In [539]: expected_cols = ['name_of_fruit','price']

In [541]: unwanted_cols = list(set(d1_cols) - set(expected_cols))

In [542]: df2 = df1[unwanted_cols]
In [543]: df1.drop(unwanted_cols, 1, inplace=True)
2
Mayank Porwal 10 Янв 2022 в 19:24
Отлично спасибо! Нужно будет добавить некоторую логику, чтобы помочь в случае отсутствия ожидаемого_столбца, но можно понять это отсюда. Спасибо!
 – 
thejoker34
10 Янв 2022 в 19:48

Используйте groupby вдоль оси столбцов, чтобы кратко разделить DataFrame. В этом случае проверьте, есть ли столбцы в вашем списке для формирования группировщика, и вы можете сохранить результаты в словаре, где ключ True получает DataFrame с подмножеством столбцов в списке и False имеет подмножество столбцов, которых нет в списке.

Пример данных

import pandas as pd

df = pd.DataFrame(data = [[1,2,3]],
                  columns=['type_of_fruit', 'name_of_fruit', 'price'])
expected_cols = ['name_of_fruit','price']

Код

d = dict(tuple(df.groupby(df.columns.isin(expected_cols), axis=1)))

# If you need to ensure columns are always there then do
#d[True] = d[True].reindex(expected_cols)

d[True]
#   name_of_fruit  price
#0              2      3

d[False]
#   type_of_fruit
#0              1
0
ALollz 10 Янв 2022 в 19:52