Pandas повторная выборка с переменной категории - PullRequest
1 голос
/ 19 июня 2020

Я хотел бы ежечасно пересчитывать фрейм данных и сохранять переменную категории, как я могу сделать это эффективно. Обычно я использую df = df.resample('h').sum(), но это не работает с моей переменной категории. Любая идея?

date  = ['2015-02-03 23:00:00','2015-02-03 23:30:00','2015-02-04 00:00:00','2015-02-04 00:30:00']
value = [33.24  , 31.71  , 34.39  , 34.49 ]
value2 = [2*x for x in value]
value3 = [3*x for x in value]
cat = ['a','a','b','b']
df = pd.DataFrame({'value':value,'value2':value2,'value3':value3,'index':date,'category':cat})

df.index = pd.to_datetime(df['index'],format='%Y-%m-%d %H:%M')
df.drop(['index'],axis=1,inplace=True)

print(df.head())
                    value  value2  value3    category
index                                     
2015-02-03 23:00:00  33.24   66.48   99.72    a
2015-02-03 23:30:00  31.71   63.42   95.13    a
2015-02-04 00:00:00  34.39   68.78  103.17    b
2015-02-04 00:30:00  34.49   68.98  103.47    b

ожидаемый результат:

                     value  value2  value3    category
index                                     
2015-02-03 23:00:00  64.95   129.9   194.85    a
2015-02-04 00:00:00  68.88   137.76  206.64    b

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Ваша sum() агрегация не имеет значения для категорий. Вы должны явно определить, какую агрегацию вы хотите для категориального столбца.

Например, если вы хотите выбрать первое значение категории, вы можете сделать:

df = df.resample('h').apply({"value":"sum", "value2":"sum", "value3":"sum", "category":"first"})
print(df)

                     value  value2  value3 category
index                                              
2015-02-03 23:00:00  64.95  129.90  194.85        a
2015-02-04 00:00:00  68.88  137.76  206.64        b
1 голос
/ 19 июня 2020

Используйте DataFrameGroupBy.resample - это означает цепочку groupby с resample:

df = df.groupby('category').resample('h').sum()
print (df)
                              value  value2  value3
category index                                     
a        2015-02-03 23:00:00  64.95  129.90  194.85
b        2015-02-04 00:00:00  68.88  137.76  206.64

Или можно использовать Grouper:

df = df.groupby(['category', pd.Grouper(freq='h')]).sum()
print (df)
                              value  value2  value3
category index                                     
a        2015-02-03 23:00:00  64.95  129.90  194.85
b        2015-02-04 00:00:00  68.88  137.76  206.64
...