Pandas Groupby то катится среднее

1

Я использую приведенный ниже код в попытке группировать по значению столбца, затем запускаю кумулятивную сумму и скользящее среднее по упорядоченным данным только для этой группы:

#this works OK
df['csum'] = df.sort_values(['name','day_time','delta_minutes'],ascending=True).groupby(['name']) ['value'].cumsum()

#throws error
df['rolling'] = df.sort_values(['name','day_time','delta_minutes'],ascending=True).groupby(['name'])['value'].rolling(window=2).mean()

Исходный фрейм данных:

    name    value   delta_minutes   day_time    
0   MAC000039   0.069   0   2012-10-13  
1   MAC000039   0.054   30  2012-10-13  
2   MAC000039   0.085   60  2012-10-13  
3   MAC000040   0.082   0   2012-10-12  
4   MAC000040   0.053   30  2012-10-12  
5   MAC000040   0.075   60  2012-10-12  
6   MAC000040   0.195   90  2012-10-12  
7   MAC000039   0.098   0   2012-10-12  
8   MAC000039   0.055   30  2012-10-12  
9   MAC000039   0.054   60  2012-10-12  
10  MAC000039   0.099   90  2012-10-12  

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

    name    value   delta_minutes   day_time  csum rolling
0   MAC000039   0.069   0   2012-10-13  0.375 ..
1   MAC000039   0.054   30  2012-10-13  0.429 ..
2   MAC000039   0.085   60  2012-10-13  0.514 ..

При попытке скользящего среднего получить следующую ошибку

TypeError: incompatible index of inserted column with frame index

есть идеи как это сделать?

  • 0
    Таким образом, вы можете получить столбец Csum, но не столбец «Rolling». Поправьте меня, если я ошибаюсь?
  • 0
    В ожидаемом выходе значения меняются (день, время, значение). Это должно случиться? Кроме того, если вам нужна помощь со скользящим столбцом, я думаю, что было бы полезно предоставить достаточно образцов данных для получения ненулевых записей.
Показать ещё 3 комментария
Теги:
pandas

1 ответ

1
Лучший ответ

Ошибка возникает из-за df.sort_values(['name','day_time','delta_minutes'],ascending=True).groupby(['name'])['value'].rolling(window=2).mean() что df.sort_values(['name','day_time','delta_minutes'],ascending=True).groupby(['name'])['value'].rolling(window=2).mean() имеет MultiIndex. Чтобы исправить это, сбросьте индекс 'name' и опустите его.

import pandas as pd

"""
name    value   delta_minutes   day_time    
0   MAC000039   0.069   0   2012-10-13  
1   MAC000039   0.054   30  2012-10-13  
2   MAC000039   0.085   60  2012-10-13  
3   MAC000040   0.082   0   2012-10-12  
4   MAC000040   0.053   30  2012-10-12  
5   MAC000040   0.075   60  2012-10-12  
6   MAC000040   0.195   90  2012-10-12  
7   MAC000039   0.098   0   2012-10-12  
8   MAC000039   0.055   30  2012-10-12  
9   MAC000039   0.054   60  2012-10-12  
10  MAC000039   0.099   90  2012-10-12
"""

df = pd.read_clipboard()

# sorting before adding columns
df.sort_values([
    'name',
    'day_time',
    'delta_minutes'
], inplace = True)

# cumulative sum grouped on name
df['csum'] = df.groupby('name').value.cumsum()

# reset index 'name' and drop it
df['rolling'] = df.groupby('name').value.rolling(2).mean().reset_index(level = 'name', drop = True)

print(df)

         name  value  delta_minutes    day_time   csum  rolling
7   MAC000039  0.098              0  2012-10-12  0.098      NaN
8   MAC000039  0.055             30  2012-10-12  0.153   0.0765
9   MAC000039  0.054             60  2012-10-12  0.207   0.0545
10  MAC000039  0.099             90  2012-10-12  0.306   0.0765
0   MAC000039  0.069              0  2012-10-13  0.375   0.0840
1   MAC000039  0.054             30  2012-10-13  0.429   0.0615
2   MAC000039  0.085             60  2012-10-13  0.514   0.0695
3   MAC000040  0.082              0  2012-10-12  0.082      NaN
4   MAC000040  0.053             30  2012-10-12  0.135   0.0675
5   MAC000040  0.075             60  2012-10-12  0.210   0.0640
6   MAC000040  0.195             90  2012-10-12  0.405   0.1350

Ещё вопросы

Сообщество Overcoder
Наверх
Меню