o
    h$                     @  s  U d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d d	lm
Z
 d d
lmZ d dlmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dl!m#Z# d dl$m%Z% d dl$m&Z& d dl$m'Z' d d l$m(Z( d d!l$m)Z) d d"l$m*Z* d d#l$m+Z+ d d$l$m,Z, d d%l$m-Z- d d&l$m.Z. erd d'l/m0Z0 d d(l1m2Z2 d d)l3m4Z4 d dl5Z6d dl7Z8d d*l9m:Z: d d+l9m;Z; d d,l9m<Z< d d-l=m>Z> d d.l?m@Z@ d d/lAmBZB d d0lCmDZD d d1lEmFZF d d2lGmHZH d d3lImJZJ d d4lImKZK d d5lImLZL d d6lImMZM d d7lImNZN d d8lImOZO d d9lImPZP d d:lImQZQ d d;lImRZR d d<lImSZS d d=lImTZT d d>lImUZU d d?lImVZV d d@l$mWZW d dAl$mXZX edBe6jYf ZZdCe[dD< e\e]dEe]dFe]dGe]dHe]dIe]dJe]dKe]dLe]dMe]dNe]dOe]dPe]dQe]dRe]dSe]dTe]dUe]dVe]dWe]dXgZ^dYe[dZ< G d[d\ d\ed] Z_dS )^    )annotations)TYPE_CHECKING)Any)Callable)Iterable)Iterator)Literal)Mapping)Sequence)cast)overloadN)EagerDataFrame)PANDAS_TO_NUMPY_DTYPE_MISSING)PandasLikeSeries)align_and_extract_native)align_series_full_broadcast)check_column_names_are_uniqueget_dtype_backend)native_to_narwhals_dtype)object_native_to_narwhals_dtype)pivot_table)rename)select_columns_by_name)	set_indexis_pandas_like_dataframe)InvalidOperationError
ShapeError)Implementation)_into_arrow_table)_remap_full_join_keys)check_column_exists)generate_temporary_column_name)import_dtypes_module)parse_columns_to_dropparse_version)scale_bytes)validate_backend_version)BytesIO)Path)
ModuleType)Self)	TypeAlias)TypeIs)PandasLikeExprPandasLikeGroupByPandasLikeNamespace)IntoArrowTable)DTypeSchema)AsofJoinStrategy)CompliantDataFrame)CompliantLazyFrame)DTypeBackend)JoinStrategy)PivotAgg)SizedMultiIndexSelector)SizedMultiNameSelector)SizeUnit)UniqueKeepStrategy)_2DArray)_SliceIndex)
_SliceName)Version)_FullContext.r/   Constructorfloat64float32int64int32int16int8uint64uint32uint16uint8boolzdatetime64[s]zdatetime64[ms]zdatetime64[us]zdatetime64[ns]ztimedelta64[s]ztimedelta64[ms]ztimedelta64[us]ztimedelta64[ns]objectzfrozenset[np.dtype[Any]]CLASSICAL_NUMPY_DTYPESc                   @  s  e Zd ZdddZedddZedddZedddZeddd Z	edd#d$Z
d	d%d&Zd	d'd(Zd
d*d+Zdd-d.Zdd0d1Zdd2d3Zd4d5dd7d8Zdd<d=Zdd@dAZddBdCddGdHZddKdLZddNdOZddRdSZddTdUZddVdWZddYdZZedd\d]ZeddadbZeddedbZeddgdbZddhdbZddjdkZeZ ddndoZ!eddqdrZ"ddsdtZ#d dvdwZ$d!d{d|Z%d"ddZ&d#ddZ'd$ddZ(d%ddZ)d&ddZ*d!ddZ+d'ddZ,d(ddZ-d)ddZ.d*ddZ/d+ddZ0d,ddZ1d-ddZ2d.ddZ3d.ddZ4dBdd/ddÄZ5dBdĜd0ddǄZ6ed1ddʄZ7d2dd΄Z8ddBdCdddЄZ9d3ddӄZ:d4ddքZ;d5ddڄZ<ed6dd܄Z=ed5dd܄Z=d7dd܄Z=d8ddZ>d9ddZ?d	ddZ@d:ddZAd;ddZBd<ddZCd=ddZDd>dd ZEd?ddZFdBS (@  PandasLikeDataFramenative_dataframer   implementationr    backend_versiontuple[int, ...]versionrG   validate_column_namesrT   returnNonec                C  s<   || _ || _|| _|| _t| j| j |rt|j d S d S N)_native_frame_implementation_backend_version_versionr*   r   columns)selfrX   rY   rZ   r\   r]    rg   S/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_pandas_like/dataframe.py__init__l   s   	zPandasLikeDataFrame.__init__datar6   contextrH   r.   c               C  st   |j }t||}| r| }n"| r ddlm} ||}n| r-| j	|}nd}t
|| j||dS )Nr   )
from_arrowzCcongratulations, you entered unreachable code - please report a bugrk   )rb   r!   	is_pandas	to_pandasis_modinmodin.pandas.utilsrl   is_cudfto_native_namespace	DataFrameAssertionErrorfrom_native)clsrj   rk   rY   tblnativempd_from_arrowmsgrg   rg   rh   rl   }   s   


zPandasLikeDataFrame.from_arrowMapping[str, Any]schema#Mapping[str, DType] | Schema | Nonec                 s   ddl m} |j   }td|j}td|j}i }d }	| D ])\}
}t||rFt	j
||d}|	d u r<|}	|||
< q!t|	|d ||
< q!|||
< q!||}|rf fdd|jD }||||}| j
||dS )	Nr   r8   ztype[pd.Series[Any]]ztype[pd.DataFrame]rm      c                 3      | ]}t | V  qd S r`   r   ).0dtyperY   rg   rh   	<genexpr>   s    

z0PandasLikeDataFrame.from_dict.<locals>.<genexpr>)narwhals.schemar9   rb   rs   r   Seriesrt   items
isinstancer   rv   r   	from_dictdtypesastypero   )rw   rj   rk   r}   r9   nsr   rt   aligned_data	left_mostnameseries	compliantry   itrg   r   rh   r      s,   	




zPandasLikeDataFrame.from_dictobjTypeIs[Any]c                 C  s   t | S r`   r   )r   rg   rg   rh   
_is_native      zPandasLikeDataFrame._is_nativec               C  s   | ||j |j|jddS )NTrY   rZ   r\   r]   )rb   rc   rd   )rw   rj   rk   rg   rg   rh   rv      s   zPandasLikeDataFrame.from_nativerD   3Mapping[str, DType] | Schema | Sequence[str] | Nonec                 s   ddl m} |j   j}t|t|fr1 fdd| D }||| d	||
|}n
||| ||d}| j||dS )Nr   r8   c                 3  r   r`   r   )r   native_typer   rg   rh   r      s
    
z1PandasLikeDataFrame.from_numpy.<locals>.<genexpr>re   rm   )r   r9   rb   rs   rt   r   r	   valueskeysr   ro   _numpy_column_namesrv   )rw   rj   rk   r}   r9   rt   r   ry   rg   r   rh   
from_numpy   s   	

zPandasLikeDataFrame.from_numpyc                 C     | S r`   rg   rf   rg   rg   rh   __narwhals_dataframe__      z*PandasLikeDataFrame.__narwhals_dataframe__c                 C  r   r`   rg   r   rg   rg   rh   __narwhals_lazyframe__   r   z*PandasLikeDataFrame.__narwhals_lazyframe__r5   c                 C  s    ddl m} || j| j| jdS )Nr   r4   )r\   )narwhals._pandas_like.namespacer5   rb   rc   rd   )rf   r5   rg   rg   rh   __narwhals_namespace__   s   z*PandasLikeDataFrame.__narwhals_namespace__r-   c                 C  s8   | j tjtjtjhv r| j  S dt| j  }t|)Nz!Expected pandas/modin/cudf, got: )rb   r    PANDASMODINCUDFrs   typeru   rf   r{   rg   rg   rh   __native_namespace__   s   
z(PandasLikeDataFrame.__native_namespace__intc                 C  s
   t | jS r`   )lenry   r   rg   rg   rh   __len__   s   
zPandasLikeDataFrame.__len__c                 C  s   | j | j| j| j|ddS )NFr   )	__class__ry   rb   rc   )rf   r\   rg   rg   rh   _with_version   s   z!PandasLikeDataFrame._with_versionTr]   dfc                C  s   | j || j| j| j|dS )Nr   )r   rb   rc   rd   )rf   r   r]   rg   rg   rh   _with_native   s   z PandasLikeDataFrame._with_nativeotherr   pd.Series[Any]c                 C  s   | j j}|jr|j }t||jd ||j|jdS t| }t| }kr2d| d| d}t||j j|urCt	|j ||j
|jdS |j S )Nr   )indexr   r   zExpected object of length z, got: .)rY   rZ   )ry   r   
_broadcastr   ilocr   r   r   r   r   rb   rc   )rf   r   r   s	len_otherlen_idxr{   rg   rg   rh   _extract_comparand  s   z&PandasLikeDataFrame._extract_comparandr   strc                 C  s   t j| j| | dS Nrm   r   rv   ry   )rf   r   rg   rg   rh   
get_column     zPandasLikeDataFrame.get_columnNcopyr   r   bool | Nonec                C  s   | j ||dS )Nr   r   )to_numpy)rf   r   r   rg   rg   rh   	__array__  s   zPandasLikeDataFrame.__array__rows'SizedMultiIndexSelector[pd.Series[Any]]c                 C  s0   t |tr	t|n|}| | jj|d d f S r`   r   tuplelistr   ry   r   )rf   r   r   rg   rg   rh   _gather  s   zPandasLikeDataFrame._gather_SliceIndex | rangec                 C  s,   | j | jjt|j|j|jd d f ddS NFr   )r   ry   r   slicestartstopstep)rf   r   rg   rg   rh   _gather_slice!  s    z!PandasLikeDataFrame._gather_slicere   rF   c                 C  sl   |j d ur| jj|j nd }|jd ur| jj|jd nd }t|||j}| j| jjd d |f ddS )Nr   Fr   )	r   ry   re   get_locr   r   r   r   r   )rf   re   r   r   selectorrg   rg   rh   _select_slice_name'  s   

z&PandasLikeDataFrame._select_slice_namec                 C  s   | j | jjd d |f ddS r   r   ry   r   rf   re   rg   rg   rh   _select_slice_index7  s   z'PandasLikeDataFrame._select_slice_indexc                 C  s4   t |tr	t|n|}| j| jjd d |f ddS r   r   r   rg   rg   rh   _select_multi_index<  s   z'PandasLikeDataFrame._select_multi_index&SizedMultiNameSelector[pd.Series[Any]]c                 C  s   |  | jjd d |f S r`   )r   ry   locr   rg   rg   rh   _select_multi_nameD  s   z&PandasLikeDataFrame._select_multi_name	list[str]c                 C  s   | j j S r`   )ry   re   tolistr   rg   rg   rh   re   J  s   zPandasLikeDataFrame.columnsnamedLiteral[True]list[dict[str, Any]]c                C     d S r`   rg   rf   r   rg   rg   rh   r   N     zPandasLikeDataFrame.rowsLiteral[False]list[tuple[Any, ...]]c                C  r   r`   rg   r   rg   rg   rh   r   U  r   ,list[tuple[Any, ...]] | list[dict[str, Any]]c                C  r   r`   rg   r   rg   rg   rh   r   \  r   c                C  sH   |s| j tju rdd | jddD S t| jjdd dS | jjddS )	Nc                 S  s   g | ]}t | qS rg   )r   r   )r   rowrg   rg   rh   
<listcomp>h      z,PandasLikeDataFrame.rows.<locals>.<listcomp>T)r   Fr   r   recordsorient)rb   r    r   r   r   ry   
itertuplesto_dictr   rg   rg   rh   r   c  s
   Iterator[PandasLikeSeries]c                 c  s*    | j  D ]\}}tj|| dV  qd S r   )ry   r   r   rv   )rf   _namer   rg   rg   rh   iter_columnsn  s   z PandasLikeDataFrame.iter_columnsbuffer_size4Iterator[tuple[Any, ...]] | Iterator[dict[str, Any]]c                c  sP    |s| j jdd dE d H  d S | j j}| j jddD ]
}tt||V  qd S )NFr   r   )ry   r   re   dictzip)rf   r   r   	col_namesr   rg   rg   rh   	iter_rowst  s   zPandasLikeDataFrame.iter_rowsdict[str, DType]c                   s    j j  fddj jD S )Nc                   sD   i | ]}| | d krt  | jjn
tj| jjqS )rU   )r   rd   rb   r   ry   r   colnative_dtypesrf   rg   rh   
<dictcomp>  s    z.PandasLikeDataFrame.schema.<locals>.<dictcomp>)ry   r   re   r   rg   r  rh   r}     s   zPandasLikeDataFrame.schemac                 C  s   | j S r`   )r}   r   rg   rg   rh   collect_schema  s   z"PandasLikeDataFrame.collect_schemacolumn_namesc                 G  s"   | j t| jt|| j| jddS r   )r   r   ry   r   rc   rb   )rf   r  rg   rg   rh   simple_select  s   z!PandasLikeDataFrame.simple_selectrf   exprsr1   c                 G  sT   | j | }|s| j| j ddS t| }|  }|dd |D }| j|ddS )NFr   c                 S  s   g | ]}|j qS rg   )ry   r   r   rg   rg   rh   r         z.PandasLikeDataFrame.select.<locals>.<listcomp>T)_evaluate_into_exprsr   ry   r   r   r   _concat_horizontal)rf   r  
new_series	namespacer   rg   rg   rh   select  s   
zPandasLikeDataFrame.selectsubsetSequence[str] | Nonec                 C  sD   |d u r| j | jjddddS |  }| ||j|   S )Nr   axisFr   )r   ry   dropnar   filterany_horizontalr   is_null)rf   r  plxrg   rg   rh   
drop_nulls  s   zPandasLikeDataFrame.drop_nullsunitrB   int | floatc                 C  s   | j jdd }t||dS )NT)deep)r  )ry   memory_usagesumr)   )rf   r  szrg   rg   rh   estimated_size  s   z"PandasLikeDataFrame.estimated_sizec                 C  sF   | j }|  }|jjtt|| |jd|}| |	|j |gS )N)rk   r   )
ry   r   _seriesfrom_iterableranger   r   aliasr   r  )rf   r   framer  	row_indexrg   rg   rh   with_row_index  s   z"PandasLikeDataFrame.with_row_indexr   tuple[Any, ...]c                 C  s   t dd | jj| D S )Nc                 s  s    | ]}|V  qd S r`   rg   )r   xrg   rg   rh   r     s    z*PandasLikeDataFrame.row.<locals>.<genexpr>)r   ry   r   )rf   r   rg   rg   rh   r     s   zPandasLikeDataFrame.row	predicatePandasLikeExpr | list[bool]c                 C  s>   t |tr|}n| |d }| |}| j| jj| ddS )Nr   Fr   )r   r   r
  r   r   ry   r   )rf   r)  mask_nativemaskrg   rg   rh   r    s   

zPandasLikeDataFrame.filterc           	        s    j | }|st dkr S dd |D }g } jjD ]}||v r+ ||}n j| }|| q| fdd| D   	 }|
|} j|ddS )Nr   c                 S  s   i | ]}|j |qS rg   )r   r  rg   rg   rh   r    s    z4PandasLikeDataFrame.with_columns.<locals>.<dictcomp>c                 3  s    | ]}  |V  qd S r`   )r   r  r   rg   rh   r     s    z3PandasLikeDataFrame.with_columns.<locals>.<genexpr>Fr   )r
  r   ry   re   r   popappendextendr   r   r  r   )	rf   r  re   name_columns	to_concatr   r   r  r   rg   r   rh   with_columns  s   


z PandasLikeDataFrame.with_columnsmappingMapping[str, str]c                 C  s   |  t| j|| j| jdS )Nre   rY   rZ   )r   r   ry   rb   rc   )rf   r3  rg   rg   rh   r     s   zPandasLikeDataFrame.renameSequence[str]strictc                C  s&   t | ||d}| j| jj|dddS )N)compliant_framere   r7  r   Fr   )r&   r   ry   drop)rf   re   r7  to_droprg   rg   rh   r9    s   zPandasLikeDataFrame.dropby
descendingbool | Sequence[bool]
nulls_lastc                G  sP   | j }t|tr| }ndd |D }|rdnd}| j|jt|||dddS )Nc                 S  s   g | ]}| qS rg   rg   )r   drg   rg   rh   r     r	  z,PandasLikeDataFrame.sort.<locals>.<listcomp>lastfirst)	ascendingna_positionFr   )ry   r   rT   r   sort_valuesr   )rf   r<  r>  r;  r   rB  rC  rg   rg   rh   sort  s   
zPandasLikeDataFrame.sortbackendImplementation | Nonekwargs!CompliantDataFrame[Any, Any, Any]c           	      K  s   |d u rt | j| j| j| jddS |tju r)dd l}t |  tjt	|| jddS |tj
u rEdd l}ddlm} ||  t	|| jddS |tju r`dd l}ddlm} ||  t	|| jdS d| }t|)	NFr   r   )ArrowDataFrame)rX   rZ   r\   r]   )PolarsDataFramer   rZ   r\   zUnsupported `backend` value: )rW   ry   rb   rc   rd   r    r   pandasro   r(   PYARROWpyarrownarwhals._arrow.dataframerJ  to_arrowPOLARSpolarsnarwhals._polars.dataframerK  	to_polars
ValueError)	rf   rF  rH  pdparJ  plrK  r{   rg   rg   rh   collect	  sH   



zPandasLikeDataFrame.collectr   drop_null_keysr3   c                G  s   ddl m} || ||dS )Nr   r2   )r[  )narwhals._pandas_like.group_byr3   )rf   r[  r   r3   rg   rg   rh   group_by=  s   zPandasLikeDataFrame.group_byhowr>   left_onright_onsuffixc             	     s  |dkr[| j tju s| j tju s| j tju rL| jdk rLtdg | j|jd}| | j	j
di |dij|j	j
di |did||d|fdj|d	S | | j	j|j	dd|fd
S |dkr| j tju rs| | j	j|j	d||dS tdg | j|jd |d u rd}t|tt|j	t|| j| j tt||| j | jd }| | j	j|d ||dj fdd j d	S |dkr|d u rd}t|tt|j	t|| j| j tt||| j | jd }| | j	j|d||dS |dkr<| j	j|j	d||d|fd}	g }
t||D ]%\}}||kr#|| jvr#|
| q||kr1|
| |  q| |	j|
d	S |dkrw|d usHJ |d usOJ t|||}|j	j|d	}t|j t| }| | j	j|||dd|fdS | | j	j|j	|||d|fdS )Ncross)r         )n_bytesre   r   inner )r^  r_  r`  suffixesr   )r^  rh  antileftanti)r^  r_  r`  z(`right_on` cannot be `None` in anti-joinr5  outer)r^  	indicatorr_  r`  c                   s   |   dkS )N	left_onlyrg   )tindicator_tokenrg   rh   <lambda>  s    z*PandasLikeDataFrame.join.<locals>.<lambda>semiz(`right_on` cannot be `None` in semi-joinleftfull)r_  r`  r^  rh  rg   )rb   r    r   r   r   rc   r$   re   r   ry   assignmerger9  	TypeErrorr   r   r   r   r   drop_duplicatesr   r.  r"   r   r   )rf   r   r^  r_  r`  ra  	key_tokenr{   other_nativeresult_nativeextraleft_key	right_keyright_on_mapperrg   ro  rh   joinB  s   	








zPandasLikeDataFrame.join
str | Noneby_leftby_rightstrategyr:   c          	      C  s0   |   }| |j| j|j|||||d|fdS )Nrg  )r_  r`  left_byright_by	directionrh  )r   r   
merge_asofry   )	rf   r   r_  r`  r  r  r  ra  r  rg   rg   rh   	join_asof  s   zPandasLikeDataFrame.join_asofnc                 C     | j | j|ddS r   )r   ry   headrf   r  rg   rg   rh   r       zPandasLikeDataFrame.headc                 C  r  r   )r   ry   tailr  rg   rg   rh   r    r  zPandasLikeDataFrame.tail)maintain_orderkeeprC   r  c                C  s8   ddd ||}t| j| | j| jj||dddS )NFrA  )noneany)r  r  r   )getr#   re   r   ry   rx  )rf   r  r  r  mapped_keeprg   rg   rh   unique  s   	zPandasLikeDataFrame.unique)rF  CompliantLazyFrame[Any, Any]c                C  s   ddl m} |  }|d u r| S |tju r,dd l}ddlm} ||d||| j	dS |tj
u rJdd l}ddlm} ||| ||| j	dS |tju rldd l}dd lm}	 ddlm}
 |
|	|||| j	dS t)	Nr   r'   )DuckDBLazyFrame	pandas_dfrL  )PolarsLazyFrame)DaskLazyFrame)rX   rZ   r\   )narwhals.utilsr(   ro   r    DUCKDBduckdbnarwhals._duckdb.dataframer  tablerd   rR  rS  rT  r  from_pandaslazyDASKdaskdask.dataframe	dataframenarwhals._dask.dataframer  ru   )rf   rF  r(   r  r  r  rY  r  r  ddr  rg   rg   rh   r    s<   


zPandasLikeDataFrame.lazytuple[int, int]c                 C  s   | j jS r`   )ry   shaper   rg   rg   rh   r  0  r   zPandasLikeDataFrame.shape	as_seriesdict[str, Any]c                  s&   |r fdd j D S  jjddS )Nc                   s"   i | ]}|t j j|  d qS )rm   r   r   r   rg   rh   r  6  s    z/PandasLikeDataFrame.to_dict.<locals>.<dictcomp>r   r   )re   ry   r   )rf   r  rg   r   rh   r   4  s
   
zPandasLikeDataFrame.to_dictc          	        s  j j} d u rjtju  |t r(|d ur!j j| dS j j dS t	j
fddj D }|rO j| jdjd j }nj }|d ur]|j| dS |D ]}t|tv r}dd l}| fddjD }|  S q_|j dS )Nr   r   c                   s(   g | ]\}}| j kr|jd ur|qS r`   )Datetime	time_zone)r   keyval)r   rg   rh   r   K  s
    z0PandasLikeDataFrame.to_numpy.<locals>.<listcomp>UTCr   c                   s,   g | ]} |j d dd d d f qS )N)r   r   )r   r   r   )r   rf   rg   rh   r   f  s    )ry   r   rb   r    r   isinrV   allr   r%   rd   r}   r   r2  r   r   dtconvert_time_zonereplace_time_zoner   r   numpyhstackre   )	rf   r   r   r  
to_convertr   	col_dtypenparrrg   )r   r   rf   rh   r   <  sF   


zPandasLikeDataFrame.to_numpypd.DataFramec                 C  sR   | j tju r	| jS | j tju r| j S | j tju r| j S d| j  }t|)NzUnknown implementation: )	rb   r    r   ry   r   ro   r   
_to_pandasru   r   rg   rg   rh   ro   n  s   

zPandasLikeDataFrame.to_pandaspl.DataFramec                 C  s   dd l }||  S )Nr   )rS  r  ro   )rf   rY  rg   rg   rh   rU  x  s   zPandasLikeDataFrame.to_polarsfilestr | Path | BytesIOc                 C  s   | j | d S r`   )ry   
to_parquetrf   r  rg   rg   rh   write_parquet}     z!PandasLikeDataFrame.write_parquetc                 C  r   r`   rg   r  rg   rg   rh   	write_csv  r   zPandasLikeDataFrame.write_csvc                 C  r   r`   rg   r  rg   rg   rh   r    r   str | Path | BytesIO | Nonec                 C  s   | j j|ddS )NFr   )ry   to_csvr  rg   rg   rh   r    r  c                 C  s   t j| jjdd | dS )NF)r  rm   )r   rv   ry   
duplicatedr   rg   rg   rh   	is_unique  s   zPandasLikeDataFrame.is_uniquer   
int | Nonecolumnint | str | Nonec                 C  s   |d u r|d u r| j dkrd| j }t|| jjd S |d u s%|d u r+d}t|t|tr6| j|n|}| jj||f S )Nr   r   zycan only call `.item()` if the dataframe is of shape (1, 1), or if explicit row/col values are provided; frame has shape )r   r   z8cannot call `.item()` with only one of `row` or `column`)r  rV  ry   r   r   r   re   r   )rf   r   r  r{   _colrg   rg   rh   item  s   
zPandasLikeDataFrame.itemc                 C  s   | j | j ddS r   )r   ry   r   r   rg   rg   rh   clone  r   zPandasLikeDataFrame.cloneoffsetc                 C  s   | j | jj|d | ddS r   r   )rf   r  r  rg   rg   rh   gather_every  s   z PandasLikeDataFrame.gather_everyonr   aggregate_functionPivotAgg | Nonesort_columns	separatorc                  s  j tju rjdk rd}t|j tju rd}t|ddlm} j}	 d u r5fddj	D  d u rD fddj	D |d u rQ|	j
 d	}
n&|d
krn|	g  td j
 d	}
n	t |d}
|rj tju rfddD }n%|rfddD }nj tju rfddD }n	fddD }t|g| R  }|
jd d |f }
|
j	 }tdkrۇfdd|D }nfdd|D }||
_	dg|
j	_|
 S )Nr  z'pivot is only supported for pandas>=1.1zcpivot is not supported for Modin backend due to https://github.com/modin-project/modin/issues/7409.r   )productc                   s    g | ]}|h  vr|qS rg   rg   r   c)r  r   rg   rh   r          z-PandasLikeDataFrame.pivot.<locals>.<listcomp>c                   s    g | ]}|h  vr|qS rg   rg   r  )r   r  rg   rh   r     r  )re   r   r   r   size)r   r   r   re   r  c                   s(   i | ]}|t  j|    qS rg   )sortedry   r  rQ  	to_pylistr   r   rg   rh   r    s    z-PandasLikeDataFrame.pivot.<locals>.<dictcomp>c                   s$   i | ]}|t  j|   qS rg   )r  ry   r  r   r   r   rg   rh   r    s   $ c                   s$   i | ]}| j |    qS rg   )ry   r  rQ  r  r   r   rg   rh   r    s    c                   s    i | ]}| j |   qS rg   )ry   r  r   r   r   rg   rh   r    r  r   c                   s.   g | ]}t d kr | n|d qS )r   )r   r  stripr   )r  r   rg   rh   r     s     c                   s^   g | ]+}t d kr|d dd|  d  d gndd|  d  d qS )r   r   z{"z","Nz"})r   r  r   )n_onr  r   rg   rh   r     s    *rg  )rb   r    r   rc   NotImplementedErrorr   	itertoolsr  ry   re   pivotgroupbyaggr   fromkeysreset_indexr   r   r   r   r   r   r   namesr   )rf   r  r   r   r  r  r  r{   r  r$  resultuniquesordered_colsre   new_columnsrg   )r   r  r  rf   r  r   rh   r    sl   

	



zPandasLikeDataFrame.pivotc                 C  s0   | j tju r| jjddS dd l}|j| jS )NF)preserve_indexr   )rb   r    r   ry   rQ  rO  Tabler  )rf   rX  rg   rg   rh   rQ    s   zPandasLikeDataFrame.to_arrowfractionfloat | Nonewith_replacementseedc                C  s   | j | jj||||dddS )N)r  fracreplacerandom_stateFr   )r   ry   sample)rf   r  r  r  r  rg   rg   rh   r     s   zPandasLikeDataFrame.samplevariable_name
value_namec                 C  s   |  | jj||||dS )N)id_vars
value_varsvar_namer  )r   ry   melt)rf   r  r   r  r  rg   rg   rh   unpivot  s   zPandasLikeDataFrame.unpivotc                   s2  t | j}|  }D ]}|| }||jkr d| d}t|qtdkr4| j| jd ddS | jd  j	  t
 fdddd  D s\dd	lm} d
}||| j}fdd|D }	g |	d  d }
fdddd  D }|  }| j|j|
g|dd| ddS )Nz-`explode` operation not supported for dtype `z`, expected List typer   r   Fr   c                 3  s&    | ]}| j   k V  qd S r`   )r   r   r  r   col_name)anchor_seriesnative_framerg   rh   r   5  s
    
z.PandasLikeDataFrame.explode.<locals>.<genexpr>r   z2exploded columns must have matching element countsc                   s   g | ]}| vr|qS rg   rg   r  r   rg   rh   r   ?  r   z/PandasLikeDataFrame.explode.<locals>.<listcomp>c                   s   g | ]
} |    qS rg   )explodeto_framer   )r  rg   rh   r   D  s    r  )r%   rd   r  Listr   r   r   ry   r  r   r  narwhals.exceptionsr   re   r   concat)rf   re   r   r}   col_to_exploder   r{   r   original_columnsother_columnsexploded_frameexploded_seriesr  rg   )r  re   r  rh   r    sD   





zPandasLikeDataFrame.explode)rX   r   rY   r    rZ   r[   r\   rG   r]   rT   r^   r_   )rj   r6   rk   rH   r^   r.   )rj   r|   rk   rH   r}   r~   r^   r.   )r   r   r^   r   )rj   r   rk   rH   r^   r.   )rj   rD   rk   rH   r}   r   r^   r.   )r^   r.   )r^   r5   )r^   r-   )r^   r   )r\   rG   r^   r.   )r   r   r]   rT   r^   r.   )r   r   r^   r   )r   r   r^   r   r`   )r   r   r   r   r^   rD   )r   r   r^   r.   )r   r   r^   r.   )re   rF   r^   r.   )re   r   r^   r.   )re   r   r^   r.   )re   r   r^   rW   )r^   r   )r   r   r^   r   )r   r   r^   r   )r   rT   r^   r   )r^   r   )r   rT   r   r   r^   r   )r^   r   )r  r   r^   r.   )rf   rW   r  r1   r^   rW   )rf   rW   r  r  r^   rW   )r  rB   r^   r  )r   r   r^   r.   )r   r   r^   r'  )rf   rW   r)  r*  r^   rW   )r3  r4  r^   r.   )re   r6  r7  rT   r^   r.   )r;  r   r<  r=  r>  rT   r^   r.   )rF  rG  rH  r   r^   rI  )r   r   r[  rT   r^   r3   )r   r.   r^  r>   r_  r  r`  r  ra  r   r^   r.   )r   r.   r_  r  r`  r  r  r  r  r  r  r:   ra  r   r^   r.   )r  r   r^   r.   )r  r  r  rC   r  r   r^   r.   )rF  rG  r^   r  )r^   r  )r  rT   r^   r  )r^   r  )r^   r  )r  r  r^   r_   )r  r_   r^   r   )r  r  r^   r  )r^   r   )r   r  r  r  r^   r   )r  r   r  r   r^   r.   )r  r6  r   r  r   r  r  r  r  rT   r  r   r^   r.   )r^   r   )
r  r  r  r  r  rT   r  r  r^   r.   )
r  r  r   r  r  r   r  r   r^   r.   )re   r6  r^   r.   )G__name__
__module____qualname__ri   classmethodrl   r   staticmethodr   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyre   r   r   r   _iter_columnsr   r}   r  r  r  r  r  r&  r   r  r2  r   r9  rE  rZ  r]  r  r  r  r  r  r  r  r   r   ro   rU  r  r  r  r  r  r  r  rQ  r  r  r  rg   rg   rg   rh   rW   i   s    #			


	4 )2
QrW   )r   r1   r   r   )`
__future__r   typingr   r   r   r   r   r   r	   r
   r   r   r  r  narwhals._compliantr   narwhals._pandas_like.seriesr   r   narwhals._pandas_like.utilsr   r   r   r   r   r   r   r   r   r   narwhals.dependenciesr   r  r   r   r  r    r!   r"   r#   r$   r%   r&   r(   r)   r*   ior+   pathlibr,   typesr-   rM  rW  rS  rY  typing_extensionsr.   r/   r0   narwhals._pandas_like.exprr1   r\  r3   r   r5   narwhals._translater6   narwhals.dtypesr7   r   r9   narwhals.typingr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rt   rI   __annotations__	frozensetr   rV   rW   rg   rg   rg   rh   <module>   s    
