У меня есть dataframe, как это
ID,Time0,Sum0,Average0,Time1,Sum1,Average1
1,1520320347531.0,59.3635,18.2828,1520324772351.0,59.5031,18.4745
1,1519860442638.0,60.1159,20.3027,1519861181524.0,60.1033,20.31705
И я хочу интерполировать по горизонтали каждые 5 минут.
этот код отлично интерполируется, если данные расположены вертикально, но я не уверен, как я интерполировать по горизонтали для этих строк. Несмотря на то, что в двух разных строках есть идентичные идентификаторы, я хочу сделать интерполяцию независимой для каждой строки.
df = df.set_index(['Time'])
df.index = pd.to_datetime(df.index, unit='ms')
df = (df.groupby('ID')[['Sum', 'Average']]
.resample('5min')
.mean()
.groupby(level=0)
.apply(lambda x: x.interpolate()).reset_index())
Какие-либо предложения?
У меня есть ответ, но он немного уродлив, для любого, кто перехватывает данные, не стесняйтесь исправить это.
Во-первых, из ваших данных я изменяю значение 1520324772351.0
(первая строка, столбец Time1) до 1520321086417.0
, иначе это будет более 10 минут и сделать пример со многими столбцами.
Из ваших данных я сначала создаю конкатенированный dataframe, такой как
df_concat = (pd.concat([df[['ID','Time0','Sum0','Average0']]
.rename(columns={'Time0':'Time','Sum0':'Sum','Average0':'Average'}),
df[['ID','Time1','Sum1','Average1']]
.rename(columns={'Time1':'Time','Sum1':'Sum','Average1':'Average'})])
.sort_index())
для получения таких данных:
ID Time Sum Average
0 1 1.520320e+12 59.3635 18.28280
0 1 1.520321e+12 59.5031 18.47450
1 1 1.519860e+12 60.1159 20.30270
1 1 1.519861e+12 60.1033 20.31705
Здесь вы можете использовать свой метод для обработки данных в столбцах с groupby в столбце индекса:
df_concat_set = df_concat.reset_index().set_index(['Time'])
df_concat_set.index = pd.to_datetime(df_concat_set.index, unit='ms')
df_concat_set = (df_concat_set.groupby('index')[['Sum', 'Average']]
.resample('5min')
.mean()
.groupby(level=0)
.apply(lambda x: x.interpolate())
.reset_index())
Здесь у вас есть данные:
index Time Sum Average
0 0 2018-03-06 07:10:00 59.3635 18.282800
1 0 2018-03-06 07:15:00 59.4333 18.378650
2 0 2018-03-06 07:20:00 59.5031 18.474500
3 1 2018-02-28 23:25:00 60.1159 20.302700
4 1 2018-02-28 23:30:00 60.1096 20.309875
5 1 2018-02-28 23:35:00 60.1033 20.317050
Чтобы вернуть его в строки, я сделал это (здесь я уверен, что есть метод pivot_table, который я не знаю, но так работает):
#first create a column with incremental number within a group of index:
df_concat_set['level_1'] = df_concat_set.groupby('index').cumcount()+1
# then set index and unstack
df_unstack = df_concat_set.set_index(['index','level_1']).unstack(level=1)
# here you have multiindex columns so change it to one level:
df_unstack.columns = [col[0]+str(col[1]-1) for col in df_unstack.columns]
# then change the order of columns (if necessary)
df_unstack = df_unstack[[ s+str(i) for i in range(len(df_unstack.columns)/3)
for s in ['Time','Sum','Average'] ]]
ваш конечный результат:
Time0 Sum0 Average0 Time1 Sum1 \
index
0 2018-03-06 07:10:00 59.3635 18.2828 2018-03-06 07:15:00 59.4333
1 2018-02-28 23:25:00 60.1159 20.3027 2018-02-28 23:30:00 60.1096
Average1 Time2 Sum2 Average2
index
0 18.378650 2018-03-06 07:20:00 59.5031 18.47450
1 20.309875 2018-02-28 23:35:00 60.1033 20.31705
который, я надеюсь, вы хотите.
Как я уже сказал, это, вероятно, чрезмерное использование, но я не мог найти другого пути.