У меня есть данные, которые распространяются в течение дня. Я сгруппировал его, а затем вычислил соотношение (вес) каждого кластера в час (не все кластеры существуют во все часы). (dataframe time_df)Заполнение DataFrame из кортежа разного размера
cluster Date
0 1 2014-02-28 14:24:59.535000+02:00
1 1 2014-02-28 14:26:35.019000+02:00
2 1 2014-02-28 14:27:37.213000+02:00
3 2 2014-02-28 14:28:35.246000+02:00
4 2 2014-02-28 14:29:37.283000+02:00
я группа по часовому и использованию н.п. bincount, чтобы вычислить вес каждого кластера:
group_by_hour = time_df.groupby(time_df.Date.dt.hour)
cluster_ids_hour = group_by_hour.cluster.\
apply(lambda arr: list(range(0,(arr+1).max()+1)))
cluster_ratio_hour = group_by_hour.cluster.\
apply(lambda arr: 1.0*np.bincount(arr+1)/len(arr))
Это дает в час различного размера массива кластеров и их вес It пытался построить dataframe
pd.DataFrame (температура, столбцы = [ 'час', 'кластеры', 'Коэффициенты'])
Но я получил следующее:
hour clusters weights
0 14 [0] [1.0]
1 15 [0, 1] [0.488888888889, 0.511111111111]
2 16 [0, 1, 2] [0.302325581395, 0.162790697674, 0.53488372093]
3 17 [0, 1, 2] [0.0, 0.0, 1.0]
4 18 [0, 1, 2] [0.0, 0.0, 1.0]
5 19 [0, 1, 2] [0.0, 0.0, 1.0]
6 20 [0, 1, 2] [0.0, 0.0, 1.0]
7 21 [0, 1, 2] [0.0, 0.0, 1.0]
8 22 [0, 1, 2] [0.0, 0.0, 1.0]
9 23 [0, 1, 2] [0.0, 0.0, 1.0]
Как это сделать, чтобы кластер был индексом и часами в виде столбцов?
0 1 2 3 4 ...
0 0.2 0.6 0.4 0.0 0.6
1 0.0 0.4 0.1 0.0 0.4
2 0.8 0.0 0.5 1.0 0.0
Спасибо, что работает отлично! –
Интересно, что этот метод дает вес кластера за один день. Я буду запускать его в течение нескольких дней, а затем объединить их все. В некоторые дни у меня есть только часть часов (например, 12,13,14), в то время как другие будут включать все часы, Как я могу конкатрировать фрейм с различным количеством столбцов? –
Извините, я не уверен, что я вас понимаю. Вам нужна функция [concat] (http://pandas.pydata.org/pandas-docs/stable/merging.html#set-logic-on-the-other-axes)? – jezrael