Группировать список по заданному элементу и вычислять среднее значение

#python #list

#python #Список

Вопрос:

Если у вас есть следующий список:

 l = [(('01001', '01003'), 4.15),
 (('01001', '01005'), 2.83),
 (('01001', '01007'), 3.32),
 (('01002', '01009'), 6.83),
 (('01002', '01011'), 2.53),
 (('01003', '01013'), 20.50),
 (('01003', '01013'), 20.50)]
  

Я хотел бы вычислить среднее значение для первого элемента этого списка (‘01001’, ‘01002’ и ‘01003’).

До сих пор моя оценка заключалась в том, чтобы преобразовать список в фрейм данных и разделить первую скобку на два столбца, а затем вычислить среднее значение. Есть ли более питонический способ?

Любая помощь будет высоко оценена!

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

1. Работает ли это? sum([int(t[0][0]) for t in l])/len(l)

Ответ №1:

Pandas кажется довольно излишним для этого. Поскольку те значения, которые нужно сгруппировать, кажутся последовательными (в противном случае вместо этого используйте словарь), вы могли бы использовать itertools.groupby и использовать среднее значение этих значений с плавающей запятой:

 from itertools import groupby
from statistics import mean

[mean(v for *_, v in v) for k,v in groupby(l, lambda x: x[0][0])]
# [3.4333333333333336, 4.68, 20.5]
  

Или, если вы предпочитаете словарь:

 {k:mean(v for *_, v in v) for k,v in groupby(l, lambda x: x[0][0])}
# {'01001': 3.4333333333333336, '01002': 4.68, '01003': 20.5}
  

Ответ №2:

Что-то вроде этого:

 from statistics import mean
l = [(('01001', '01003'), 4.15),
 (('01001', '01005'), 2.83),
 (('01001', '01007'), 3.32),
 (('01002', '01009'), 6.83),
 (('01002', '01011'), 2.53),
 (('01003', '01013'), 20.50),
 (('01003', '01013'), 20.50)]
 
print(mean(int(x[0][0]) for x in l))
  

вывод

 1001.8571428571429