#python-3.x
#python-3.x
Вопрос:
добрый день!
Я пытаюсь найти минимальные и максимальные значения для данного набора данных
foo,1,1
foo,2,5
foo,3,0
bar,1,5
bar,2,0
bar,3,0
foo,1,1
foo,2,2
foo,3,4
bar,1,4
bar,2,0
bar,3,1
foo,1,4
foo,2,2
foo,3,3
bar,1,1
bar,2,3
bar,3,0
Я пытаюсь отсортировать свои данные, используя 1-й и 2-й столбцы в качестве идентификатора и 3-й столбец в качестве значения
from collections import defaultdict
data = defaultdict(list)
with open("file1.txt", 'r') as infile:
for line in infile:
line = line.strip().split(',')
meta = line[0]
id_ = line[1]
value = line[2]
try:
value = int(line[2])
data[meta id_].append(value)
except ValueError:
print ('nope', sep='')
вывод моей функции:
defaultdict(list,
{'foo1': ['1', '1', '4'],
'foo2': ['5', '2', '2'],
'foo3': ['0', '4', '3'],
'bar1': ['5', '4', '1'],
'bar2': ['0', '0', '3'],
'bar3': ['0', '1', '0']})
пожалуйста, посоветуйте, как я могу получить минимальные и максимальные значения для каждого идентификатора?
итак, мне нужен вывод чего-то подобного:
defaultdict(list,
{'foo1': ['1', '4'],
'foo2': ['2', '5'],
'foo3': ['0', '4'],
'bar1': ['1', '5'],
'bar2': ['0', '3'],
'bar3': ['0', '1']})
Обновить:
с помощью @AndiFB я добавляю сортировку в свои списки:
def sorting_func(string):
return int(string)
from collections import defaultdict
data = defaultdict(list)
with open("file1.txt", 'r') as infile:
for line in infile:
line = line.strip().split(',')
meta = line[0]
id_ = line[1]
value = line[2]
try:
if value != "-":
value = int(line[2])
data[meta id_].append(value)
data[meta id_].sort(key=sorting_func)
print("max:", *data[meta id_][-1:], 'min:',*data[meta id_][:1])
except ValueError:
print ('nope', sep='')
data
Вывод:
max: 1 min: 1
max: 5 min: 5
max: 0 min: 0
max: 5 min: 5
max: 0 min: 0
max: 0 min: 0
max: 1 min: 1
max: 5 min: 2
max: 4 min: 0
max: 5 min: 4
max: 0 min: 0
max: 1 min: 0
max: 4 min: 1
max: 5 min: 2
max: 4 min: 0
max: 5 min: 1
max: 3 min: 0
max: 1 min: 0
defaultdict(list,
{'foo1': [1, 1, 4],
'foo2': [2, 2, 5],
'foo3': [0, 3, 4],
'bar1': [1, 4, 5],
'bar2': [0, 0, 3],
'bar3': [0, 0, 1]})
Пожалуйста, посоветуйте, как сохранить только минимальное и максимальное (первое и последнее) значения в списке?
чтобы получить что-то вроде этого:
defaultdict(list,
{'foo1': ['1', '4'],
'foo2': ['2', '5'],
'foo3': ['0', '4'],
'bar1': ['1', '5'],
'bar2': ['0', '3'],
'bar3': ['0', '1']})
Ответ №1:
def sorting_func(string):
return int(string)
d = defaultdict(list)
d['python'].append('10')
d['python'].append('2')
d['python'].append('5')
print("d['python'].__contains__('10'): {}".format(d['python'].__contains__('10')))
print(str(d['python']))
d['python'].sort(key=sorting_func)
print('d["python"]: ' str(d['python']))
print('d["python"][0]: ' d['python'][0])
print('d["python"][2]: ' d['python'][2])
print(str(len(d['python'])))
В результате получается следующий вывод
d['python'].__contains__('10'): True
['10', '2', '5']
d["python"]: ['2', '5', '10']
d["python"][0]: 2
d["python"][2]: 10
3
Вы можете отсортировать список, оставив в первой позиции минимальное значение, а в последней
— максимальное значение
Имейте в виду, что если строка, содержащаяся в dic, не может быть преобразована в Int, это приведет к исключению. Функция сортировки ожидает, что число будет сравниваться. Например, другая функция сортировки может быть:
def sorting_func(string):
return len(string)
Этот сортирует по длине строки.
Ответ №2:
Поскольку вы работаете с набором данных, простым способом достижения этой цели было бы использование pandas, а затем выполнение groupby id
и агрегирование values
для получения минимальных и максимальных значений для каждого идентификатора
#your question
s ="""foo,1,1
foo,2,5
foo,3,0
bar,1,5
bar,2,0
bar,3,0
foo,1,1
foo,2,2
foo,3,4
bar,1,4
bar,2,0
bar,3,1
foo,1,4
foo,2,2
foo,3,3
bar,1,1
bar,2,3
bar,3,0"""
#splitting on new line
t = s.split('n')
#creating datframe with comma separation
import pandas as pd
df = pd.DataFrame([i.split(',') for i in t])
Output:
>>> df
0 1 2
0 foo 1 1
1 foo 2 5
2 foo 3 0
3 bar 1 5
4 bar 2 0
5 bar 3 0
6 foo 1 1
7 foo 2 2
8 foo 3 4
9 bar 1 4
10 bar 2 0
11 bar 3 1
12 foo 1 4
13 foo 2 2
14 foo 3 3
15 bar 1 1
16 bar 2 3
17 bar 3 0
#creating id column by concatenating column 1 and 2, renaming column 2 as 'value' and dropping them col1 and 2
df['id']=df[0] df[1]
df = df.rename(columns={df.columns[2]: 'value'})
df = df.drop([0,1], axis = 1)
Output:
>>> df
value id
0 1 foo1
1 5 foo2
2 0 foo3
3 5 bar1
4 0 bar2
5 0 bar3
6 1 foo1
7 2 foo2
8 4 foo3
9 4 bar1
10 0 bar2
11 1 bar3
12 4 foo1
13 2 foo2
14 3 foo3
15 1 bar1
16 3 bar2
17 0 bar3
#doing grouby and aggregating to get min and max for each id
df.groupby('id').value.agg([min,max])
Output:
min max
id
bar1 1 5
bar2 0 3
bar3 0 1
foo1 1 4
foo2 2 5
foo3 0 4
Комментарии:
1. спасибо, но я стараюсь выполнять эти задачи без панд