2015-02-21 2 views
2

мне трудно использовать pd.rolling_mean функции следующего кадра данных, содержащие дублированные показатели:Нанести прокатки средней функции на кадрах данных с дублированными индексами в панде

   amount 
    20140101 3 
    20140102 4 
    20140103 3 
    20140103 5 
    20140103 1 
    20140104 5 
    20140105 6 
    20140106 2 
    … 

Мне нужно рассчитать 3 дня в среднем " количество», например, в среднем от 20140101 до 20140103 должна быть (3+4+3+5+1)/5=3.2, среднее от суммы 20140104 до 20140106 должен быть (5+6+2)/3=4.3

кто-нибудь знает, как это сделать? Заранее спасибо!

ответ

1

вы можете сделать:

>>> df 
      amount 
20140101  3 
20140102  4 
20140103  3 
20140103  5 
20140103  1 
20140104  5 
20140105  6 
20140106  2 
>>> xf = df.groupby(level=0)['amount'].agg(['sum', 'count']) 
>>> xf 
      sum count 
20140101 3  1 
20140102 4  1 
20140103 9  3 
20140104 5  1 
20140105 6  1 
20140106 2  1 
>>> pd.rolling_sum(xf['sum'], 3, 0)/pd.rolling_sum(xf['count'], 3, 0) 
20140101 3.000 
20140102 3.500 
20140103 3.200 
20140104 3.600 
20140105 4.000 
20140106 4.333 
dtype: float64 

и вы получите 3.2 и 4.3 для 20140103 и 20140106 соответственно.

1

Если столбец дата уже даты и времени и индекс вы можете просто позвонить rolling_mean:

In [15]: 

pd.rolling_mean(df['amount'], window=1, freq='3d') 
Out[15]: 
date 
2014-01-01 3.200000 
2014-01-04 4.333333 
Freq: 3D, dtype: float64 

При необходимости вы можете преобразовать ваш индекс к DateTime, выполнив следующие действия:

df.index = pd.to_datetime(df.index.astype(str), '%Y%m%d')

Это в том случае, если индекс действительно является dtype int64, если он уже является строкой, тогда вы можете игнорировать бит astype

+0

До сих пор не осознавал использование «freq», спасибо! он не будет работать с кадрами данных с нерегулярным пространством, что и в случае с моими фактическими кадрами данных. – user6396

Смежные вопросы