Вы можете сделать следующее -
СПОСОБ 1: Использование PANDAS
#Mention all the columns and respective aggregations as key, value for a dict
g = {'var2':'mean', 'var3':'max', 'var4':'min'}
#Apply groupby with agg() using the above dict
df.groupby(['var1']).agg(g).reset_index()
Просто замените var1
, var2
, var3
, var4
с фактическими именами переменных в коде.
var1 var2 var3 var4
0 2018 13.000000 16 35
1 2019 34.666667 96 31
РЕДАКТИРОВАТЬ: если вы не должны использовать какие-либо pandas или numpy, тогда я должен предположить, что ваш набор данных на самом деле список списков, а НЕ pandas фрейм данных иначе, что нарушило бы цель. В этом случае вы можете использовать понимание списка, чтобы решить эту проблему следующим образом -
МЕТОД 2: Использование понимания списка
data = [[2019, 10, 56, 34],[2019, 74, 66 ,32],[2019, 20, 96, 31],[2018, 13, 16, 35], [2018, 14, 27, 33]]
#function to calculate average on a list
def average(lst):
return sum(lst) / len(lst)
#get set list of years
unique_years = set([i[0] for i in data])
[[[j[0] for j in data if j[0]==i][0],
average([j[1] for j in data if j[0]==i]),
max([j[2] for j in data if j[0]==i]),
min([j[3] for j in data if j[0]==i])] for i in unique_years]
#output: [[2018, 13.5, 27, 33], [2019, 34.666666666666664, 96, 31]]
Вы также можете сделать это с помощью явных циклов for, если вас не устраивает понимание списков -
МЕТОД 3: Использование явного FOR - IF
yr = []
v1 = []
v2 = []
v3 = []
#function to calculate average on a list
def average(lst):
return sum(lst) / len(lst)
#get set list of years
unique_years = set([i[0] for i in data])
for i in unique_years:
for j in data:
if j[0]==i:
v1.append(j[1])
v2.append(j[2])
v3.append(j[3])
yr.append([i,average(v1),max(v2), min(v3)])
print(yr)
#output: [[2018, 13.5, 27, 33], [2019, 26.2, 96, 31]]