Skip to content

Commit f7d6b58

Browse files
jbrockmendeljreback
authored andcommitted
REF: eliminate statefulness in FrameApply (#29620)
1 parent 71b7868 commit f7d6b58

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

pandas/core/apply.py

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import abc
22
import inspect
3-
from typing import TYPE_CHECKING, Any, Dict, Iterator, Optional, Type, Union
3+
from typing import TYPE_CHECKING, Any, Dict, Iterator, Tuple, Type, Union
44

55
import numpy as np
66

@@ -72,7 +72,9 @@ def series_generator(self) -> Iterator["Series"]:
7272
pass
7373

7474
@abc.abstractmethod
75-
def wrap_results_for_axis(self, results: ResType) -> Union["Series", "DataFrame"]:
75+
def wrap_results_for_axis(
76+
self, results: ResType, res_index: "Index"
77+
) -> Union["Series", "DataFrame"]:
7678
pass
7779

7880
# ---------------------------------------------------------------
@@ -112,15 +114,6 @@ def f(x):
112114

113115
self.f = f
114116

115-
# results
116-
self.result = None
117-
self._res_index: Optional["Index"] = None
118-
119-
@property
120-
def res_index(self) -> "Index":
121-
assert self._res_index is not None
122-
return self._res_index
123-
124117
@property
125118
def res_columns(self) -> "Index":
126119
return self.result_columns
@@ -313,12 +306,12 @@ def apply_standard(self):
313306
return self.obj._constructor_sliced(result, index=labels)
314307

315308
# compute the result using the series generator
316-
results = self.apply_series_generator()
309+
results, res_index = self.apply_series_generator()
317310

318311
# wrap results
319-
return self.wrap_results(results)
312+
return self.wrap_results(results, res_index)
320313

321-
def apply_series_generator(self) -> ResType:
314+
def apply_series_generator(self) -> Tuple[ResType, "Index"]:
322315
series_gen = self.series_generator
323316
res_index = self.result_index
324317

@@ -345,19 +338,20 @@ def apply_series_generator(self) -> ResType:
345338
results[i] = self.f(v)
346339
keys.append(v.name)
347340

348-
self._res_index = res_index
349-
return results
341+
return results, res_index
350342

351-
def wrap_results(self, results: ResType) -> Union["Series", "DataFrame"]:
343+
def wrap_results(
344+
self, results: ResType, res_index: "Index"
345+
) -> Union["Series", "DataFrame"]:
352346

353347
# see if we can infer the results
354348
if len(results) > 0 and 0 in results and is_sequence(results[0]):
355349

356-
return self.wrap_results_for_axis(results)
350+
return self.wrap_results_for_axis(results, res_index)
357351

358352
# dict of scalars
359353
result = self.obj._constructor_sliced(results)
360-
result.index = self.res_index
354+
result.index = res_index
361355

362356
return result
363357

@@ -380,7 +374,9 @@ def result_index(self) -> "Index":
380374
def result_columns(self) -> "Index":
381375
return self.index
382376

383-
def wrap_results_for_axis(self, results: ResType) -> "DataFrame":
377+
def wrap_results_for_axis(
378+
self, results: ResType, res_index: "Index"
379+
) -> "DataFrame":
384380
""" return the results for the rows """
385381

386382
result = self.obj._constructor(data=results)
@@ -389,8 +385,8 @@ def wrap_results_for_axis(self, results: ResType) -> "DataFrame":
389385
if len(result.index) == len(self.res_columns):
390386
result.index = self.res_columns
391387

392-
if len(result.columns) == len(self.res_index):
393-
result.columns = self.res_index
388+
if len(result.columns) == len(res_index):
389+
result.columns = res_index
394390

395391
return result
396392

@@ -418,35 +414,37 @@ def result_index(self) -> "Index":
418414
def result_columns(self) -> "Index":
419415
return self.columns
420416

421-
def wrap_results_for_axis(self, results: ResType) -> Union["Series", "DataFrame"]:
417+
def wrap_results_for_axis(
418+
self, results: ResType, res_index: "Index"
419+
) -> Union["Series", "DataFrame"]:
422420
""" return the results for the columns """
423421
result: Union["Series", "DataFrame"]
424422

425423
# we have requested to expand
426424
if self.result_type == "expand":
427-
result = self.infer_to_same_shape(results)
425+
result = self.infer_to_same_shape(results, res_index)
428426

429427
# we have a non-series and don't want inference
430428
elif not isinstance(results[0], ABCSeries):
431429
from pandas import Series
432430

433431
result = Series(results)
434-
result.index = self.res_index
432+
result.index = res_index
435433

436434
# we may want to infer results
437435
else:
438-
result = self.infer_to_same_shape(results)
436+
result = self.infer_to_same_shape(results, res_index)
439437

440438
return result
441439

442-
def infer_to_same_shape(self, results: ResType) -> "DataFrame":
440+
def infer_to_same_shape(self, results: ResType, res_index: "Index") -> "DataFrame":
443441
""" infer the results to the same shape as the input object """
444442

445443
result = self.obj._constructor(data=results)
446444
result = result.T
447445

448446
# set the index
449-
result.index = self.res_index
447+
result.index = res_index
450448

451449
# infer dtypes
452450
result = result.infer_objects()

0 commit comments

Comments
 (0)