簡體   English   中英

使用Groupby的Pandas窗口無法按預期工作

[英]Pandas Windowing with Groupby not Working as Expected

我有一個pandas數據框,正在嘗試按列分組后計算擴展的窗口聚合。 數據結構是這樣的:

df = pd.DataFrame([['A',1,2015,4],['A',1,2016,5],['A',1,2017,6],['B',1,2015,10],['B',1,2016,11],['B',1,2017,12],
               ['A',1,2015,24],['A',1,2016,25],['A',1,2017,26],['B',1,2015,30],['B',1,2016,31],['B',1,2017,32],
              ['A',2,2015,4],['A',2,2016,5],['A',2,2017,6],['B',2,2015,10],['B',2,2016,11],['B',2,2017,12]],columns=['Typ','ID','Year','dat'])\
.sort_values(by=['Typ','ID','Year'])

    Typ ID  Year    dat
0   A   1   2015    4
6   A   1   2015    24
1   A   1   2016    5
7   A   1   2016    25
2   A   1   2017    6
8   A   1   2017    26
12  A   2   2015    4
13  A   2   2016    5
14  A   2   2017    6
3   B   1   2015    10
9   B   1   2015    30
4   B   1   2016    11
10  B   1   2016    31
5   B   1   2017    12
11  B   1   2017    32
15  B   2   2015    10
16  B   2   2016    11
17  B   2   2017    12

我需要按TypeID列將此數據框分組,然后按Year計算所有觀測值的擴展均值。 我寫的代碼是

df.groupby(by=['Typ','ID','Year']).expanding().mean().reset_index()

從中我期望這樣的輸出結果(忽略level_3 ):

    Typ ID  Year    level_3 dat
0   A   1   2015    6   14.0
1   A   1   2016    7   14.5
2   A   1   2017    8   15.0
3   A   2   2015    12  4.0
4   A   2   2016    13  4.5
5   A   2   2017    14  5.0
6   B   1   2015    9   20.0
7   B   1   2016    10  20.5
8   B   1   2017    11  21.0
9   B   2   2015    15  10.0
10  B   2   2016    16  10.5
11  B   2   2017    17  11.0

['Type','ID','Year']分組將為這些列的每個唯一行產生一行。 相反,代碼給出了以下內容:

Typ ID  Year    level_3 dat
0   A   1   2015    0   4.0
1   A   1   2015    6   14.0
2   A   1   2016    1   5.0
3   A   1   2016    7   15.0
4   A   1   2017    2   6.0
5   A   1   2017    8   16.0
6   A   2   2015    12  4.0
7   A   2   2016    13  5.0
8   A   2   2017    14  6.0
9   B   1   2015    3   10.0
10  B   1   2015    9   20.0
11  B   1   2016    4   11.0
12  B   1   2016    10  21.0
13  B   1   2017    5   12.0
14  B   1   2017    11  22.0
15  B   2   2015    15  10.0
16  B   2   2016    16  11.0
17  B   2   2017    17  12.0

鑒於邏輯, expanding()窗口函數似乎無法正確地與groupby配合使用,或者至少它的行為不如我預期。 我究竟做錯了什么?

編輯:我現在看到我在做什么錯,因為我期待之間不同的集成groupbyexpanding 所以現在我的問題是,如何使用熊貓來獲得所需的輸出-無需任何手動迭代。

據我所知,擴展均值具有不同的計算方式。 對於所需的輸出,我將結合使用groupbycumsum ,然后在sumcount之間進行簡單的划分:

newDf = df.groupby(['Typ','ID','Year'])['dat'].agg(('sum', 'count')).groupby(['Typ','ID']).cumsum()
newDf['dat'] = newDf['sum']/newDf['count']
newDf = newDf.reset_index().drop(['count', 'sum'], axis = 1)

輸出:

   Typ  ID  Year   dat
0    A   1  2015  14.0
1    A   1  2016  14.5
2    A   1  2017  15.0
3    A   2  2015   4.0
4    A   2  2016   4.5
5    A   2  2017   5.0
6    B   1  2015  20.0
7    B   1  2016  20.5
8    B   1  2017  21.0
9    B   2  2015  10.0
10   B   2  2016  10.5
11   B   2  2017  11.0

暫無
暫無

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

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