Skip to content

Commit 8609cfb

Browse files
authored
chore: Redo CompliantExpr.from_column_indices (#2561)
* chore: Redo `CompliantExpr.from_column_indices` Resolves 1 task for (#2525) * refactor: Get a bit DRY-er Resolves (#2561 (comment))
1 parent 2a40f36 commit 8609cfb

File tree

8 files changed

+28
-43
lines changed

8 files changed

+28
-43
lines changed

narwhals/_arrow/expr.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,27 +94,20 @@ def func(df: ArrowDataFrame) -> list[ArrowSeries]:
9494
)
9595

9696
@classmethod
97-
def from_column_indices(
98-
cls: type[Self], *column_indices: int, context: _FullContext
99-
) -> Self:
100-
from narwhals._arrow.series import ArrowSeries
101-
97+
def from_column_indices(cls, *column_indices: int, context: _FullContext) -> Self:
10298
def func(df: ArrowDataFrame) -> list[ArrowSeries]:
99+
tbl = df.native
100+
cols = df.columns
103101
return [
104-
ArrowSeries(
105-
df.native[column_index],
106-
name=df.native.column_names[column_index],
107-
backend_version=df._backend_version,
108-
version=df._version,
109-
)
110-
for column_index in column_indices
102+
ArrowSeries.from_native(tbl[i], name=cols[i], context=df)
103+
for i in column_indices
111104
]
112105

113106
return cls(
114107
func,
115108
depth=0,
116109
function_name="nth",
117-
evaluate_output_names=lambda df: [df.columns[i] for i in column_indices],
110+
evaluate_output_names=cls._eval_names_indices(column_indices),
118111
alias_output_names=None,
119112
backend_version=context._backend_version,
120113
version=context._version,

narwhals/_compliant/expr.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,14 @@ def from_column_names(
109109
context: _FullContext,
110110
) -> Self: ...
111111
@classmethod
112-
def from_column_indices(
113-
cls: type[Self], *column_indices: int, context: _FullContext
114-
) -> Self: ...
112+
def from_column_indices(cls, *column_indices: int, context: _FullContext) -> Self: ...
113+
@staticmethod
114+
def _eval_names_indices(indices: Sequence[int], /) -> EvalNames[CompliantFrameT]:
115+
def fn(df: CompliantFrameT) -> Sequence[str]:
116+
column_names = df.columns
117+
return [column_names[i] for i in indices]
118+
119+
return fn
115120

116121
def is_null(self) -> Self: ...
117122
def abs(self) -> Self: ...

narwhals/_dask/expr.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,19 +135,15 @@ def func(df: DaskLazyFrame) -> list[dx.Series]:
135135
)
136136

137137
@classmethod
138-
def from_column_indices(
139-
cls: type[Self], *column_indices: int, context: _FullContext
140-
) -> Self:
138+
def from_column_indices(cls, *column_indices: int, context: _FullContext) -> Self:
141139
def func(df: DaskLazyFrame) -> list[dx.Series]:
142-
return [
143-
df._native_frame.iloc[:, column_index] for column_index in column_indices
144-
]
140+
return [df.native.iloc[:, i] for i in column_indices]
145141

146142
return cls(
147143
func,
148144
depth=0,
149145
function_name="nth",
150-
evaluate_output_names=lambda df: [df.columns[i] for i in column_indices],
146+
evaluate_output_names=cls._eval_names_indices(column_indices),
151147
alias_output_names=None,
152148
backend_version=context._backend_version,
153149
version=context._version,

narwhals/_duckdb/expr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ def func(df: DuckDBLazyFrame) -> list[duckdb.Expression]:
206206

207207
return cls(
208208
func,
209-
evaluate_output_names=lambda df: [df.columns[i] for i in column_indices],
209+
evaluate_output_names=cls._eval_names_indices(column_indices),
210210
alias_output_names=None,
211211
backend_version=context._backend_version,
212212
version=context._version,

narwhals/_ibis/expr.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,13 @@ def func(df: IbisLazyFrame) -> list[ir.Column]:
197197
)
198198

199199
@classmethod
200-
def from_column_indices(
201-
cls: type[Self], *column_indices: int, context: _FullContext
202-
) -> Self:
200+
def from_column_indices(cls, *column_indices: int, context: _FullContext) -> Self:
203201
def func(df: IbisLazyFrame) -> list[ir.Column]:
204202
return [df.native[i] for i in column_indices]
205203

206204
return cls(
207205
func,
208-
evaluate_output_names=lambda df: [df.columns[i] for i in column_indices],
206+
evaluate_output_names=cls._eval_names_indices(column_indices),
209207
alias_output_names=None,
210208
backend_version=context._backend_version,
211209
version=context._version,

narwhals/_pandas_like/expr.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -148,25 +148,19 @@ def func(df: PandasLikeDataFrame) -> list[PandasLikeSeries]:
148148
)
149149

150150
@classmethod
151-
def from_column_indices(
152-
cls: type[Self], *column_indices: int, context: _FullContext
153-
) -> Self:
151+
def from_column_indices(cls, *column_indices: int, context: _FullContext) -> Self:
154152
def func(df: PandasLikeDataFrame) -> list[PandasLikeSeries]:
153+
native = df.native
155154
return [
156-
PandasLikeSeries(
157-
df._native_frame.iloc[:, column_index],
158-
implementation=df._implementation,
159-
backend_version=df._backend_version,
160-
version=df._version,
161-
)
162-
for column_index in column_indices
155+
PandasLikeSeries.from_native(native.iloc[:, i], context=df)
156+
for i in column_indices
163157
]
164158

165159
return cls(
166160
func,
167161
depth=0,
168162
function_name="nth",
169-
evaluate_output_names=lambda df: [df.columns[i] for i in column_indices],
163+
evaluate_output_names=cls._eval_names_indices(column_indices),
170164
alias_output_names=None,
171165
implementation=context._implementation,
172166
backend_version=context._backend_version,

narwhals/_polars/expr.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ def struct(self) -> PolarsExprStructNamespace:
263263
__call__: Any
264264
from_column_names: Any
265265
from_column_indices: Any
266+
_eval_names_indices: Any
266267

267268
# Polars
268269
abs: Method[Self]

narwhals/_spark_like/expr.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,16 +299,14 @@ def func(df: SparkLikeLazyFrame) -> list[Column]:
299299
)
300300

301301
@classmethod
302-
def from_column_indices(
303-
cls: type[Self], *column_indices: int, context: _FullContext
304-
) -> Self:
302+
def from_column_indices(cls, *column_indices: int, context: _FullContext) -> Self:
305303
def func(df: SparkLikeLazyFrame) -> list[Column]:
306304
columns = df.columns
307305
return [df._F.col(columns[i]) for i in column_indices]
308306

309307
return cls(
310308
func,
311-
evaluate_output_names=lambda df: [df.columns[i] for i in column_indices],
309+
evaluate_output_names=cls._eval_names_indices(column_indices),
312310
alias_output_names=None,
313311
backend_version=context._backend_version,
314312
version=context._version,

0 commit comments

Comments
 (0)