@@ -588,23 +588,31 @@ def test_groupby_rolling_nans_in_index(self, rollings, key):
588
588
with pytest .raises (ValueError , match = f"{ key } must be monotonic" ):
589
589
df .groupby ("c" ).rolling ("60min" , ** rollings )
590
590
591
- def test_groupby_rolling_group_keys (self ):
591
+ @pytest .mark .parametrize ("group_keys" , [True , False ])
592
+ def test_groupby_rolling_group_keys (self , group_keys ):
592
593
# GH 37641
594
+ # GH 38523: GH 37641 actually was not a bug.
595
+ # group_keys only applies to groupby.apply directly
593
596
arrays = [["val1" , "val1" , "val2" ], ["val1" , "val1" , "val2" ]]
594
597
index = MultiIndex .from_arrays (arrays , names = ("idx1" , "idx2" ))
595
598
596
599
s = Series ([1 , 2 , 3 ], index = index )
597
- result = s .groupby (["idx1" , "idx2" ], group_keys = False ).rolling (1 ).mean ()
600
+ result = s .groupby (["idx1" , "idx2" ], group_keys = group_keys ).rolling (1 ).mean ()
598
601
expected = Series (
599
602
[1.0 , 2.0 , 3.0 ],
600
603
index = MultiIndex .from_tuples (
601
- [("val1" , "val1" ), ("val1" , "val1" ), ("val2" , "val2" )],
602
- names = ["idx1" , "idx2" ],
604
+ [
605
+ ("val1" , "val1" , "val1" , "val1" ),
606
+ ("val1" , "val1" , "val1" , "val1" ),
607
+ ("val2" , "val2" , "val2" , "val2" ),
608
+ ],
609
+ names = ["idx1" , "idx2" , "idx1" , "idx2" ],
603
610
),
604
611
)
605
612
tm .assert_series_equal (result , expected )
606
613
607
614
def test_groupby_rolling_index_level_and_column_label (self ):
615
+ # The groupby keys should not appear as a resulting column
608
616
arrays = [["val1" , "val1" , "val2" ], ["val1" , "val1" , "val2" ]]
609
617
index = MultiIndex .from_arrays (arrays , names = ("idx1" , "idx2" ))
610
618
@@ -613,7 +621,12 @@ def test_groupby_rolling_index_level_and_column_label(self):
613
621
expected = DataFrame (
614
622
{"B" : [0.0 , 1.0 , 2.0 ]},
615
623
index = MultiIndex .from_tuples (
616
- [("val1" , 1 ), ("val1" , 1 ), ("val2" , 2 )], names = ["idx1" , "A" ]
624
+ [
625
+ ("val1" , 1 , "val1" , "val1" ),
626
+ ("val1" , 1 , "val1" , "val1" ),
627
+ ("val2" , 2 , "val2" , "val2" ),
628
+ ],
629
+ names = ["idx1" , "A" , "idx1" , "idx2" ],
617
630
),
618
631
)
619
632
tm .assert_frame_equal (result , expected )
@@ -695,6 +708,30 @@ def test_by_column_not_in_values(self, columns):
695
708
assert "A" not in result .columns
696
709
tm .assert_frame_equal (g .obj , original_obj )
697
710
711
+ def test_groupby_level (self ):
712
+ # GH 38523, 38787
713
+ arrays = [
714
+ ["Falcon" , "Falcon" , "Parrot" , "Parrot" ],
715
+ ["Captive" , "Wild" , "Captive" , "Wild" ],
716
+ ]
717
+ index = MultiIndex .from_arrays (arrays , names = ("Animal" , "Type" ))
718
+ df = DataFrame ({"Max Speed" : [390.0 , 350.0 , 30.0 , 20.0 ]}, index = index )
719
+ result = df .groupby (level = 0 )["Max Speed" ].rolling (2 ).sum ()
720
+ expected = Series (
721
+ [np .nan , 740.0 , np .nan , 50.0 ],
722
+ index = MultiIndex .from_tuples (
723
+ [
724
+ ("Falcon" , "Falcon" , "Captive" ),
725
+ ("Falcon" , "Falcon" , "Wild" ),
726
+ ("Parrot" , "Parrot" , "Captive" ),
727
+ ("Parrot" , "Parrot" , "Wild" ),
728
+ ],
729
+ names = ["Animal" , "Animal" , "Type" ],
730
+ ),
731
+ name = "Max Speed" ,
732
+ )
733
+ tm .assert_series_equal (result , expected )
734
+
698
735
699
736
class TestExpanding :
700
737
def setup_method (self ):
0 commit comments