Удалить столбцы для самых высоких значений в последней строке в pandas - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть несколько CSV-файлов в один столбец, которые я использую pandas для объединения и нахождения среднего значения:

#!/usr/bin/env python3

import os
import glob
import pandas as pd
from sys import argv, exit

os.chdir(f'{argv[1]}')
filenames = [i for i in glob.glob('*.csv')]
comb = pd.concat([pd.read_csv(f, header=None) for f in filenames], axis=1)
comb.columns = [f'Run {i+1}' for i in range(len(comb.columns))]
comb['Mean'] = comb.mean(numeric_only=True, axis=1)
comb.insert(loc=0, column='Epoch', value=[i+1 for i in range(len(comb))])
comb.to_csv(f'{argv[2]}', index=False)

Где argv[1] - каталог для объединения, а argv[2] - для сохранения составной файл. Пример ввода может быть:

0.6932
0.6605
0.634
0.5904
0.5339

И пример вывода:

Epoch   Run 1   Run 2   Run 3   Run 4   Run 5   Mean
1   0.6932  0.6711  0.6687  0.6814  0.6903  0.684856667
2   0.6605  0.6326  0.6423  0.6323  0.6247  0.639423333
3   0.634   0.6003  0.6063  0.5928  0.5786  0.603956667
4   0.5904  0.5604  0.5576  0.5448  0.5276  0.559693333
5   0.5339  0.519   0.5068  0.496   0.4813  0.513653333

Это объединение пяти CSV-файлов из одного столбца и пяти строк.

Как я могу удалить столбцы из этой таблицы, которые имеют наибольшее число для последней строки? Скажем, я хочу отбросить два столбца, в данном случае Run 1 и Run 2. Желаемым выводом может быть:

Epoch   Run 3   Run 4   Run 5   Mean
1   0.6687  0.6814  0.6903  0.680133333
2   0.6423  0.6323  0.6247  0.6331
3   0.6063  0.5928  0.5786  0.592566667
4   0.5576  0.5448  0.5276  0.543333333
5   0.5068  0.496   0.4813  0.4947

Имеет ли pandas встроенную функцию для удаления столбцов на основе значения некоторой строки? Меня интересует последняя строка для данного столбца и удаление там столбцов с наибольшим значением.

1 Ответ

3 голосов
/ 23 апреля 2020

Это может быть немного убито:

to_drop = (df.filter(like='Run')  # choose only the `Run` columns
             .iloc[-1]            # and the last row
             .nlargest(2)         # two largest cells
             .index               # then the index, i.e. column names
          )

df = df.drop(to_drop, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...