@@ -866,6 +866,57 @@ def test_agg_namedtuple(self):
866866 expected = df .groupby ("A" ).agg (b = ("B" , "sum" ), c = ("B" , "count" ))
867867 tm .assert_frame_equal (result , expected )
868868
869+ def n_between (self , ser , low , high , ** kwargs ):
870+ return ser .between (low , high , ** kwargs ).sum ()
871+
872+ def test_namedagg_args (self ):
873+ df = DataFrame ({"A" : [0 , 0 , 1 , 1 ], "B" : [- 1 , 0 , 1 , 2 ]})
874+
875+ result = df .groupby ("A" ).agg (
876+ count_between = pd .NamedAgg ("B" , self .n_between , 0 , 1 )
877+ )
878+ expected = DataFrame ({"count_between" : [1 , 1 ]}, index = Index ([0 , 1 ], name = "A" ))
879+ tm .assert_frame_equal (result , expected )
880+
881+ def test_namedagg_kwargs (self ):
882+ df = DataFrame ({"A" : [0 , 0 , 1 , 1 ], "B" : [- 1 , 0 , 1 , 2 ]})
883+
884+ result = df .groupby ("A" ).agg (
885+ count_between_kw = pd .NamedAgg ("B" , self .n_between , 0 , 1 , inclusive = "both" )
886+ )
887+ expected = DataFrame (
888+ {"count_between_kw" : [1 , 1 ]}, index = Index ([0 , 1 ], name = "A" )
889+ )
890+ tm .assert_frame_equal (result , expected )
891+
892+ def test_namedagg_args_and_kwargs (self ):
893+ df = DataFrame ({"A" : [0 , 0 , 1 , 1 ], "B" : [- 1 , 0 , 1 , 2 ]})
894+
895+ result = df .groupby ("A" ).agg (
896+ count_between_mix = pd .NamedAgg (
897+ "B" , self .n_between , 0 , 1 , inclusive = "neither"
898+ )
899+ )
900+ expected = DataFrame (
901+ {"count_between_mix" : [0 , 0 ]}, index = Index ([0 , 1 ], name = "A" )
902+ )
903+ tm .assert_frame_equal (result , expected )
904+
905+ def test_multiple_named_agg_with_args_and_kwargs (self ):
906+ df = DataFrame ({"A" : [0 , 1 , 2 , 3 ], "B" : [1 , 2 , 3 , 4 ]})
907+
908+ result = df .groupby ("A" ).agg (
909+ n_between01 = pd .NamedAgg ("B" , self .n_between , 0 , 1 ),
910+ n_between13 = pd .NamedAgg ("B" , self .n_between , 1 , 3 ),
911+ n_between02 = pd .NamedAgg ("B" , self .n_between , 0 , 2 ),
912+ )
913+ expected = df .groupby ("A" ).agg (
914+ n_between01 = ("B" , lambda x : x .between (0 , 1 ).sum ()),
915+ n_between13 = ("B" , lambda x : x .between (0 , 3 ).sum ()),
916+ n_between02 = ("B" , lambda x : x .between (0 , 2 ).sum ()),
917+ )
918+ tm .assert_frame_equal (result , expected )
919+
869920 def test_mangled (self ):
870921 df = DataFrame ({"A" : [0 , 1 ], "B" : [1 , 2 ], "C" : [3 , 4 ]})
871922 result = df .groupby ("A" ).agg (b = ("B" , lambda x : 0 ), c = ("C" , lambda x : 1 ))
0 commit comments