#python #pandas #algorithm #numpy
#python #pandas #алгоритм #numpy
Вопрос:
Добрый день! Существует следующий набор данных временных рядов:
Time Value
1 1
2 1
3 1
4 2
5 2
6 2
7 2
8 3
9 3
10 4
11 4
12 5
Мне нужно разделить и сгруппировать данные по значению следующим образом:
Value Time start, Time end
1 1 3
2 4 7
3 8 9
4 10 11
5 12 12
Как сделать это быстро и в наиболее функциональном стиле программирования на python? Можно использовать различные библиотеки, например pandas, numpy.
Комментарии:
1.
Various libraries can be used for example pandas, numpy.
— правильно, и что вы выбрали и попробовали?2. @buran, я думаю, что pandas наиболее подходит для этой цели. Но я ищу самый красивый вариант. Если я добьюсь успеха сам, тогда я отвечу на вопрос
Ответ №1:
Попробуйте с pandas:
df.groupby('Time')['Value'].agg(['min','max'])
Ответ №2:
Мы можем использовать pandas для этого:
Решение:
data = {'Time': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
'Value': [1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5]
}
df = pd.DataFrame(data, columns= ['Time', 'Value'])
res = df.groupby('Value').agg(['min', 'max'])
f_res = res.rename(columns = {'min': 'Start Time', 'max': 'End Time'}, inplace = False)
print(f_res)
Вывод:
Time
Start Time End Time
Value
1 1 3
2 4 7
3 8 9
4 10 11
5 12 12
Ответ №3:
сначала получите количество значений
result = df.groupby('Value').agg(['count'])
result.columns = result.columns.get_level_values(1) #drop multi-index
result
count
Value
1 3
2 4
3 2
4 2
5 1
затем cumcount, чтобы начать время
s = df.groupby('Value').cumcount()
result["time start"] = s[s == 0].index.tolist()
result
count time start
Value
1 3 0
2 4 3
3 2 7
4 2 9
5 1 11
наконец,
result["time start"] = 1
result["time end"] = result["time start"] result['count'] - 1
result
count time start time end
Value
1 3 1 3
2 4 4 7
3 2 8 9
4 2 10 11
5 1 12 12