簡體   English   中英

熊貓:groupby均值后的條件切片

[英]Pandas: conditional slicing after groupby mean

這一定是以前問過的,但是我找不到解決方案-如果重復,對不起! 我按月和年對具有日期時間索引(稱為“時間”)的數據幀進行了df = df.groupby([df.index.year, df.index.month]).mean()並應用了平均值df = df.groupby([df.index.year, df.index.month]).mean() ,得出下列:

               0
time    time    

2000    1   0.245888
    2   0.579210
    3   0.519101
    4   1.724130
    5   2.909998
    6   6.754044
    7   5.654214
    8   0.972300
    9   0.207180
    10  -0.608038
    11  -2.271975
    12  -9.407542
2001    1   -4.206406
    2   0.339256
    3   2.447668
    4   2.159161
    5   2.014476
    6   4.495522
    7   2.130116
    8   4.280266
    9   2.329842
    10  -1.560461
    11  -2.232722
    12  -2.182392

它有2個索引,分別稱為“時間”,分別對應於年和月。 現在,我想按月分片(用month = 1或從month = 6到8等創建一個新的數據框),但是我不確定如何對此進行操作。

我想做類似的事情:

df.loc[(df.index.month == 1)]
df.loc[(df.index.month == 1) | (df.index.month == 2)]
df.loc[(df.index.month >= 1) & (df.index.month <= 6)]

等等

這樣做會AttributeError: 'MultiIndex' object has no attribute 'month' (可以理解)。 我嘗試使用df.rename(['year', 'month'])重命名索引,這使AttributeError list object is not callable 我以為也許我需要重置索引,使其再次為日期時間格式,但df.reset_index()給出ValueError cannot insert time

df.index給出:

MultiIndex(levels=[[2000, 2001], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
           codes=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]],
           names=['time', 'time'])

編輯 -1.編輯以表示我希望對切片進行更靈活的操作,而不僅僅是獲得特定的月份。 2.原始df如下所示:

             0
time    
2000-01-01  1.427332
2000-01-02  1.468405
2000-01-03  1.525916
2000-01-04  1.399915
2000-01-05  1.192117
2000-01-06  1.191234
2000-01-07  1.431109
2000-01-08  1.687709
2000-01-09  1.876527
2000-01-10  1.871062
2000-01-11  1.759002
2000-01-12  1.553009
2000-01-13  1.336487
2000-01-14  1.105376
2000-01-15  0.732866
2000-01-16  0.259119
2000-01-17  -0.003458
2000-01-18  -0.180170
2000-01-19  -0.275862
2000-01-20  -0.580456
2000-01-21  -0.800049
2000-01-22  -0.990277
2000-01-23  -1.139482
2000-01-24  -1.264528
2000-01-25  -1.378858
2000-01-26  -1.516954
2000-01-27  -1.394427
2000-01-28  -1.371782
2000-01-29  -1.337087
2000-01-30  -1.120146
... ...
2001-12-02  -4.521928
2001-12-03  -4.499393
2001-12-04  -4.425628
2001-12-05  -4.270720
2001-12-06  -4.286983
2001-12-07  -4.141410
2001-12-08  -3.886460
2001-12-09  -4.008633
2001-12-10  -3.772096
2001-12-11  -3.261724
2001-12-12  -3.271314
2001-12-13  -3.306891
2001-12-14  -3.111070
2001-12-15  -2.694092
2001-12-16  -2.063524
2001-12-17  -1.593670
2001-12-18  -1.279061
2001-12-19  -0.957185
2001-12-20  -0.616801
2001-12-21  -0.316757
2001-12-22  -0.292797
2001-12-23  -0.226818
2001-12-24  -0.196901
2001-12-25  -0.237203
2001-12-26  -0.221769
2001-12-27  -0.167911
2001-12-28  -0.050808
2001-12-29  -0.044765
2001-12-30  -0.384740
2001-12-31  -0.913277
730 rows × 1 columns

首先可以使用rename

df = df.groupby([df.index.year.rename('year'), 
                 df.index.month.rename('month')]).mean()

rename_axis用於設置MultiIndex名稱:

df = df.groupby([df.index.year, df.index.month]).mean().rename_axis(('year','month'))

選擇使用DataFrame.xs

df1 = df.xs(1, axis=0, level=1)

如果要在解決方案中使用類似的過濾器,則需要get_level_values用於選擇第二級:

df.loc[(df.index.get_level_values(1) == 1)]

暫無
暫無

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

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