Добавить групповые особенности в панде dataframe - PullRequest
2 голосов
/ 08 мая 2019

У меня есть данные временного ряда, содержащие цены на газ для тысяч заправок (uuid), обновляемые несколько раз в день в течение нескольких лет.

(доступно через: git clone https://dev.azure.com/tankerkoenig/tankerkoenig-data/_git/tankerkoenig-data)

df = 
datetime,uuid,diesel,e5,e10
2018-01-31 00:01:06+01,c03c846e-64ec-437f-9a52-9eda8088c4b2,1.239,1.419,1.399
2018-01-31 00:03:06+01,6dc575da-3c85-430c-a17a-6efdae0dcf5a,1.249,1.419,1.399

Я хочу добавить столбец функций, в котором указывается значение ежедневно min() и max() для каждой цены diesel,e5,e10 для каждой отдельной uuid (АЗС).

Поэтому я добавляю столбец даты:

df['date'] = index.date

и затем сгруппируйте кадр данных:

df.groupby(['uuid','date','datetime']).sum()

                                                                            diesel  e5      e10
                                uuid    date        datetime            
00006210-0037-4444-8888-acdc00006210    2018-01-01  2018-01-01 06:33:06     1.189   1.389   1.369
                                                    2018-01-01 06:39:05     1.189   1.349   1.329

как мне теперь добавить определенные для группы столбцы Я думаю, что использование GroupBy.apply () может быть правильным, но это очень медленно или не работает.

def fun(df):
    df['diesel_low'] = df['diesel'].min()
    return df
df.groupby(['uuid','date','datetime']).apply(lambda x: fun(x))

1 Ответ

2 голосов
/ 08 мая 2019

Я полагаю, вам нужно агрегировать по GroupBy.agg, затем сгладить MultiIndex в столбцах и преобразовать индекс в столбцы по DataFrame.reset_index:

print (df)
                                                           uuid  diesel  e5  \
datetime                                                                      
2018-01-31 00:01:06+01:00  c03c846e-64ec-437f-9a52-9eda8088c4b2      15   1   
2018-01-31 00:03:06+01:00  6dc575da-3c85-430c-a17a-6efdae0dcf5a       9   4   
2018-01-31 00:01:06+01:00  c03c846e-64ec-437f-9a52-9eda8088c4b2      19   1   
2018-01-31 00:03:06+01:00  6dc575da-3c85-430c-a17a-6efdae0dcf5a      12   9   

                           e10  
datetime                        
2018-01-31 00:01:06+01:00    4  
2018-01-31 00:03:06+01:00    1  
2018-01-31 00:01:06+01:00    5  
2018-01-31 00:03:06+01:00   12  

df['date'] = df.index.date
cols = ['diesel','e5','e10']
df1 = df.groupby(['uuid','date'])[cols].agg([('low', 'min'),('high', 'max')])
df1.columns = df1.columns.map('_'.join)
print (df1)
                                                 diesel_low  diesel_high  \
uuid                                 date                                  
6dc575da-3c85-430c-a17a-6efdae0dcf5a 2018-01-31           9           12   
c03c846e-64ec-437f-9a52-9eda8088c4b2 2018-01-31          15           19   

                                                 e5_low  e5_high  e10_low  \
uuid                                 date                                   
6dc575da-3c85-430c-a17a-6efdae0dcf5a 2018-01-31       4        9        1   
c03c846e-64ec-437f-9a52-9eda8088c4b2 2018-01-31       1        1        4   

                                                 e10_high  
uuid                                 date                  
6dc575da-3c85-430c-a17a-6efdae0dcf5a 2018-01-31        12  
c03c846e-64ec-437f-9a52-9eda8088c4b2 2018-01-31         5  

df = df.join(df1, on=['uuid','date'])
print (df)
                                                           uuid  diesel  e5  \
datetime                                                                      
2018-01-31 00:01:06+01:00  c03c846e-64ec-437f-9a52-9eda8088c4b2      15   1   
2018-01-31 00:03:06+01:00  6dc575da-3c85-430c-a17a-6efdae0dcf5a       9   4   
2018-01-31 00:01:06+01:00  c03c846e-64ec-437f-9a52-9eda8088c4b2      19   1   
2018-01-31 00:03:06+01:00  6dc575da-3c85-430c-a17a-6efdae0dcf5a      12   9   

                           e10        date  diesel_low  diesel_high  e5_low  \
datetime                                                                      
2018-01-31 00:01:06+01:00    4  2018-01-31          15           19       1   
2018-01-31 00:03:06+01:00    1  2018-01-31           9           12       4   
2018-01-31 00:01:06+01:00    5  2018-01-31          15           19       1   
2018-01-31 00:03:06+01:00   12  2018-01-31           9           12       4   

                           e5_high  e10_low  e10_high  
datetime                                               
2018-01-31 00:01:06+01:00        1        4         5  
2018-01-31 00:03:06+01:00        9        1        12  
2018-01-31 00:01:06+01:00        1        4         5  
2018-01-31 00:03:06+01:00        9        1        12  

Другое решение:

df['date'] = df.index.date
cols = ['diesel','e5','e10']
df1 = df.groupby(['uuid','date'])[cols].transform('max').add_suffix('_high')
df2 = df.groupby(['uuid','date'])[cols].transform('min').add_suffix('_low')

df = pd.concat([df, df1, df2], axis=1)
print (df)
                                                           uuid  diesel  e5  \
datetime                                                                      
2018-01-31 00:01:06+01:00  c03c846e-64ec-437f-9a52-9eda8088c4b2      15   1   
2018-01-31 00:03:06+01:00  6dc575da-3c85-430c-a17a-6efdae0dcf5a       9   4   
2018-01-31 00:01:06+01:00  c03c846e-64ec-437f-9a52-9eda8088c4b2      19   1   
2018-01-31 00:03:06+01:00  6dc575da-3c85-430c-a17a-6efdae0dcf5a      12   9   

                           e10        date  diesel_high  e5_high  e10_high  \
datetime                                                                     
2018-01-31 00:01:06+01:00    4  2018-01-31           19        1         5   
2018-01-31 00:03:06+01:00    1  2018-01-31           12        9        12   
2018-01-31 00:01:06+01:00    5  2018-01-31           19        1         5   
2018-01-31 00:03:06+01:00   12  2018-01-31           12        9        12   

                           diesel_low  e5_low  e10_low  
datetime                                                
2018-01-31 00:01:06+01:00          15       1        4  
2018-01-31 00:03:06+01:00           9       4        1  
2018-01-31 00:01:06+01:00          15       1        4  
2018-01-31 00:03:06+01:00           9       4        1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...