Найти ближайший столбец к фрейму данных pandas среднее значение

#python #pandas

#python #pandas

Вопрос:

Например, у меня есть определенный фрейм данных pandas

   A.1 A.2 A.3 A.4 B.1 B.2 B.3
0 1   5   8   10  ... 
1 2   4   6   7   ... 
2 3   3   6   1   ... 
 

Я хочу вычислить средний столбец фрейма данных pandas по строкам только для столбцов, содержащих ‘A’, например :

 A.avg
6
4.75
3.25
 

а затем найдите, какой из столбцов ‘A’ является ближайшим (наименьшая среднеквадратичная ошибка) к среднему значению и получите его имя столбца (здесь это будет A.2)

Первая часть довольно проста, но я больше всего борюсь со второй частью

Редактировать: это то, что я делаю, чтобы найти максимальный идентификатор столбца (у меня есть список подстрок (таких как A, B, C и т. Д.), И я выполняю развертку по фрейму данных):

 max_id_per_substring = [
            self.table[[column for column in list(self.table) if substring in column]].idxmax(axis=1).iloc[-1]  for substring in self.all_substrings]
 

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

1. Можете ли вы включить код для первой части, который «довольно прост»?

2. я привел пример, в котором я делаю то же самое, чтобы найти максимальный идентификатор столбца (у меня есть список подстрок, и я выполняю развертку по фрейму данных): max_id_per_substring = [ self.table[[column for column in list(self.table) if substring in column]].idxmax(axis=1).iloc[-1] for substring in self.all_substrings]

3. Вопрос отредактирован, чтобы прояснить его подробнее

Ответ №1:

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

 import pandas as pd

df = pd.DataFrame({'A.1':[1,2,3], 'A.2':[5,4,3], 'A.3':[8,6,6], 'A.4':[10,7,1], 'B.1':[0,0,0]})

arr = df.filter(like='A.').to_numpy().T
col_number = ((arr - arr.mean(0))**2).sum(1).argmin()

print(df.filter(like='A.').columns[col_number])
#A.2