code: def test_groupby_fill():
      df1 = pd.DataFrame(
          [
              [1, 1, 10],
              [1, 1, np.nan],
              [1, 1, np.nan],
              [1, 2, np.nan],
              [1, 2, 20],
              [1, 2, np.nan],
              [1, 3, np.nan],
              [1, 3, np.nan],
          ],
          columns=["one", "two", "three"],
      )
      mdf = md.DataFrame(df1, chunk_size=3)
  
      r = tile(mdf.groupby(["one", "two"]).ffill())
      assert r.op.output_types[0] == OutputType.dataframe
      assert r.shape == (len(df1), 1)
      assert len(r.chunks) == 3
      assert r.chunks[0].shape == (np.nan, 1)
      assert r.dtypes.index.tolist() == ["three"]
  
      r = tile(mdf.groupby(["two"]).bfill())
      assert r.op.output_types[0] == OutputType.dataframe
      assert r.shape == (len(df1), 2)
      assert len(r.chunks) == 3
      assert r.chunks[0].shape == (np.nan, 2)
      assert r.dtypes.index.tolist() == ["one", "three"]
  
      r = tile(mdf.groupby(["two"]).backfill())
      assert r.op.output_types[0] == OutputType.dataframe
      assert r.shape == (len(df1), 2)
      assert len(r.chunks) == 3
      assert r.chunks[0].shape == (np.nan, 2)
      assert r.dtypes.index.tolist() == ["one", "three"]
  
      r = tile(mdf.groupby(["one"]).fillna(5))
      assert r.op.output_types[0] == OutputType.dataframe
      assert r.shape == (len(df1), 2)
      assert len(r.chunks) == 3
      assert r.chunks[0].shape == (np.nan, 2)
      assert r.dtypes.index.tolist() == ["two", "three"]
  
      s1 = pd.Series([4, 3, 9, np.nan, np.nan, 7, 10, 8, 1, 6])
      ms1 = md.Series(s1, chunk_size=3)
      r = tile(ms1.groupby(lambda x: x % 2).ffill())
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      r = tile(ms1.groupby(lambda x: x % 2).bfill())
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      r = tile(ms1.groupby(lambda x: x % 2).backfill())
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      r = tile(ms1.groupby(lambda x: x % 2).fillna(5))
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      s1 = pd.Series([4, 3, 9, np.nan, np.nan, 7, 10, 8, 1, 6])
      ms1 = md.Series(s1, chunk_size=3)
  
      r = tile(ms1.groupby(lambda x: x % 2).ffill())
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      r = tile(ms1.groupby(lambda x: x % 2).bfill())
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      r = tile(ms1.groupby(lambda x: x % 2).backfill())
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
      r = tile(ms1.groupby(lambda x: x % 2).fillna(5))
      assert r.op.output_types[0] == OutputType.series
      assert len(r.chunks) == 4
      assert r.shape == (len(s1),)
      assert r.chunks[0].shape == (np.nan,)
  
imports: from collections import OrderedDict
  import numpy
  import pandas
  import pytest
  from ..sort import DataFrameGroupbySortShuffle
  from ....None import dataframe
  from ....None import opcodes
  from ....config import option_context
  from ....core import OutputType, tile
  from ....core.operand import OperandStage
  from ...core import DataFrameGroupBy, SeriesGroupBy, DataFrame
  from ..core import DataFrameGroupByOperand, DataFrameShuffleProxy
  from ..aggregation import DataFrameGroupByAgg
  from ..getitem import GroupByIndex
label_desc: Use image node_id 8 for calling a global function with example usage: test_groupby_fill() without return types