@@ -588,23 +588,31 @@ def test_groupby_rolling_nans_in_index(self, rollings, key):
588588 with pytest .raises (ValueError , match = f"{ key } must be monotonic" ):
589589 df .groupby ("c" ).rolling ("60min" , ** rollings )
590590
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 ):
592593 # GH 37641
594+ # GH 38523: GH 37641 actually was not a bug.
595+ # group_keys only applies to groupby.apply directly
593596 arrays = [["val1" , "val1" , "val2" ], ["val1" , "val1" , "val2" ]]
594597 index = MultiIndex .from_arrays (arrays , names = ("idx1" , "idx2" ))
595598
596599 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 ()
598601 expected = Series (
599602 [1.0 , 2.0 , 3.0 ],
600603 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" ],
603610 ),
604611 )
605612 tm .assert_series_equal (result , expected )
606613
607614 def test_groupby_rolling_index_level_and_column_label (self ):
615+ # The groupby keys should not appear as a resulting column
608616 arrays = [["val1" , "val1" , "val2" ], ["val1" , "val1" , "val2" ]]
609617 index = MultiIndex .from_arrays (arrays , names = ("idx1" , "idx2" ))
610618
@@ -613,7 +621,12 @@ def test_groupby_rolling_index_level_and_column_label(self):
613621 expected = DataFrame (
614622 {"B" : [0.0 , 1.0 , 2.0 ]},
615623 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" ],
617630 ),
618631 )
619632 tm .assert_frame_equal (result , expected )
@@ -695,6 +708,30 @@ def test_by_column_not_in_values(self, columns):
695708 assert "A" not in result .columns
696709 tm .assert_frame_equal (g .obj , original_obj )
697710
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+
698735
699736class TestExpanding :
700737 def setup_method (self ):
0 commit comments