Динамически сравнивать столбцы в pandas столбцах - PullRequest
1 голос
/ 18 июня 2020

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

У меня есть следующее, которое работает с копированием и вставкой имена

df = df[~(  (df['FirstCol'] > df['SecondCol']) |
            (df['ThirdCol'] > df['FifthCol']) |
             ...
            (df['FiftiethCol'] > df['TweniethCol']) |
            (df['ThisCouldBeHundredsCol'] > df['LastOne'])
        )]

Однако я хочу иметь возможность делать это с меньшими объемами кода. Если у меня есть имена столбцов, которые нужно сравнить в списке, например,

list_of_comparison_cols = ['FirstCol', 'SecondCol', 'ThirdCol', 'FifthCol', ..., 'FiftiethCol', 'TweniethCol', 'ThisCouldBeHundredsCol', 'LastOne']

Как я могу go сделать это как можно меньше кода и более динамично?

Большое спасибо.

1 Ответ

2 голосов
/ 18 июня 2020

Вы можете сделать это, выбрав каждые два элемента вашего списка с помощью [::2], чтобы получить ['FirstCol', 'ThirdCol',...], и [1::2], чтобы получить ['SecondCol', 'FifthCol', .... Используйте его для выбора столбцов и сравнения массивов to_numpy между обеими сторонами неравенства. Затем используйте any вместо оси = 1, что соответствует |, используемому в вашем условии.

#example
list_of_comparison_cols = ['FirstCol', 'SecondCol', 'ThirdCol', 'FifthCol', 
                           'FiftiethCol', 'TweniethCol', 'ThisCouldBeHundredsCol', 
                           'LastOne']
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0,50,8*10).reshape(10,8), 
                  columns=list_of_comparison_cols)
# create the mask
mask = (df[list_of_comparison_cols[::2]].to_numpy()
        >df[list_of_comparison_cols[1::2]].to_numpy()
       ).any(1)
print (df[~mask])
   FirstCol  SecondCol  ThirdCol  FifthCol  FiftiethCol  TweniethCol  \
0        44         47         0         3            3           39   

   ThisCouldBeHundredsCol  LastOne  
0                       9       19  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...