[英]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.