簡體   English   中英

Pandas groupby 然后滾動平均值

[英]Pandas groupby then rolling mean

我正在使用下面的代碼嘗試按列值分組,然后僅對該組的有序數據運行累積總和和移動平均值:

#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

知道如何做到這一點嗎?

出現錯誤是因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM