@@ -97,6 +97,16 @@ def __getitem__(
9797 return _iloc_getitem_series_or_dataframe (self ._series , key )
9898
9999
100+ class IatSeriesIndexer :
101+ def __init__ (self , series : bigframes .series .Series ):
102+ self ._series = series
103+
104+ def __getitem__ (self , key : int ) -> bigframes .core .scalar .Scalar :
105+ if not isinstance (key , int ):
106+ raise ValueError ("Series iAt based indexing can only have integer indexers" )
107+ return self ._series .iloc [key ]
108+
109+
100110class LocDataFrameIndexer :
101111 def __init__ (self , dataframe : bigframes .dataframe .DataFrame ):
102112 self ._dataframe = dataframe
@@ -188,6 +198,28 @@ def __getitem__(self, key) -> Union[bigframes.dataframe.DataFrame, pd.Series]:
188198 return _iloc_getitem_series_or_dataframe (self ._dataframe , key )
189199
190200
201+ class IatDataFrameIndexer :
202+ def __init__ (self , dataframe : bigframes .dataframe .DataFrame ):
203+ self ._dataframe = dataframe
204+
205+ def __getitem__ (self , key : tuple ) -> bigframes .core .scalar .Scalar :
206+ error_message = "DataFrame.iat should be indexed by a tuple of exactly 2 ints"
207+ # we raise TypeError or ValueError under the same conditions that pandas does
208+ if isinstance (key , int ):
209+ raise TypeError (error_message )
210+ if not isinstance (key , tuple ):
211+ raise ValueError (error_message )
212+ key_values_are_ints = [isinstance (key_value , int ) for key_value in key ]
213+ if not all (key_values_are_ints ):
214+ raise ValueError (error_message )
215+ if len (key ) != 2 :
216+ raise TypeError (error_message )
217+ block = self ._dataframe ._block
218+ column_block = block .select_columns ([block .value_columns [key [1 ]]])
219+ column = bigframes .series .Series (column_block )
220+ return column .iloc [key [0 ]]
221+
222+
191223@typing .overload
192224def _loc_getitem_series_or_dataframe (
193225 series_or_dataframe : bigframes .series .Series , key
@@ -356,6 +388,18 @@ def _iloc_getitem_series_or_dataframe(
356388 return result_pd_df .iloc [0 ]
357389 elif isinstance (key , slice ):
358390 return series_or_dataframe ._slice (key .start , key .stop , key .step )
391+ elif isinstance (key , tuple ) and len (key ) == 0 :
392+ return series_or_dataframe
393+ elif isinstance (key , tuple ) and len (key ) == 1 :
394+ return _iloc_getitem_series_or_dataframe (series_or_dataframe , key [0 ])
395+ elif (
396+ isinstance (key , tuple )
397+ and isinstance (series_or_dataframe , bigframes .dataframe .DataFrame )
398+ and len (key ) == 2
399+ ):
400+ return series_or_dataframe .iat [key ]
401+ elif isinstance (key , tuple ):
402+ raise pd .errors .IndexingError ("Too many indexers" )
359403 elif pd .api .types .is_list_like (key ):
360404 if len (key ) == 0 :
361405 return typing .cast (
0 commit comments