|
27 | 27 | AggFuncType, |
28 | 28 | AggFuncTypeBase, |
29 | 29 | AggFuncTypeDict, |
30 | | - AggObjType, |
31 | 30 | Axis, |
32 | 31 | FrameOrSeries, |
33 | 32 | FrameOrSeriesUnion, |
34 | 33 | ) |
35 | 34 |
|
36 | | -from pandas.core.dtypes.cast import is_nested_object |
37 | 35 | from pandas.core.dtypes.common import is_dict_like, is_list_like |
38 | | -from pandas.core.dtypes.generic import ABCDataFrame, ABCNDFrame, ABCSeries |
| 36 | +from pandas.core.dtypes.generic import ABCDataFrame, ABCSeries |
39 | 37 |
|
40 | 38 | from pandas.core.algorithms import safe_sort |
41 | | -from pandas.core.base import DataError, SpecificationError |
| 39 | +from pandas.core.base import SpecificationError |
42 | 40 | import pandas.core.common as com |
43 | 41 | from pandas.core.indexes.api import Index |
44 | 42 |
|
@@ -532,215 +530,3 @@ def transform_str_or_callable( |
532 | 530 | return obj.apply(func, args=args, **kwargs) |
533 | 531 | except Exception: |
534 | 532 | return func(obj, *args, **kwargs) |
535 | | - |
536 | | - |
537 | | -def agg_list_like( |
538 | | - obj: AggObjType, |
539 | | - arg: List[AggFuncTypeBase], |
540 | | - _axis: int, |
541 | | -) -> FrameOrSeriesUnion: |
542 | | - """ |
543 | | - Compute aggregation in the case of a list-like argument. |
544 | | -
|
545 | | - Parameters |
546 | | - ---------- |
547 | | - obj : Pandas object to compute aggregation on. |
548 | | - arg : list |
549 | | - Aggregations to compute. |
550 | | - _axis : int, 0 or 1 |
551 | | - Axis to compute aggregation on. |
552 | | -
|
553 | | - Returns |
554 | | - ------- |
555 | | - Result of aggregation. |
556 | | - """ |
557 | | - from pandas.core.reshape.concat import concat |
558 | | - |
559 | | - if _axis != 0: |
560 | | - raise NotImplementedError("axis other than 0 is not supported") |
561 | | - |
562 | | - if obj._selected_obj.ndim == 1: |
563 | | - selected_obj = obj._selected_obj |
564 | | - else: |
565 | | - selected_obj = obj._obj_with_exclusions |
566 | | - |
567 | | - results = [] |
568 | | - keys = [] |
569 | | - |
570 | | - # degenerate case |
571 | | - if selected_obj.ndim == 1: |
572 | | - for a in arg: |
573 | | - colg = obj._gotitem(selected_obj.name, ndim=1, subset=selected_obj) |
574 | | - try: |
575 | | - new_res = colg.aggregate(a) |
576 | | - |
577 | | - except TypeError: |
578 | | - pass |
579 | | - else: |
580 | | - results.append(new_res) |
581 | | - |
582 | | - # make sure we find a good name |
583 | | - name = com.get_callable_name(a) or a |
584 | | - keys.append(name) |
585 | | - |
586 | | - # multiples |
587 | | - else: |
588 | | - for index, col in enumerate(selected_obj): |
589 | | - colg = obj._gotitem(col, ndim=1, subset=selected_obj.iloc[:, index]) |
590 | | - try: |
591 | | - new_res = colg.aggregate(arg) |
592 | | - except (TypeError, DataError): |
593 | | - pass |
594 | | - except ValueError as err: |
595 | | - # cannot aggregate |
596 | | - if "Must produce aggregated value" in str(err): |
597 | | - # raised directly in _aggregate_named |
598 | | - pass |
599 | | - elif "no results" in str(err): |
600 | | - # raised directly in _aggregate_multiple_funcs |
601 | | - pass |
602 | | - else: |
603 | | - raise |
604 | | - else: |
605 | | - results.append(new_res) |
606 | | - keys.append(col) |
607 | | - |
608 | | - # if we are empty |
609 | | - if not len(results): |
610 | | - raise ValueError("no results") |
611 | | - |
612 | | - try: |
613 | | - return concat(results, keys=keys, axis=1, sort=False) |
614 | | - except TypeError as err: |
615 | | - |
616 | | - # we are concatting non-NDFrame objects, |
617 | | - # e.g. a list of scalars |
618 | | - |
619 | | - from pandas import Series |
620 | | - |
621 | | - result = Series(results, index=keys, name=obj.name) |
622 | | - if is_nested_object(result): |
623 | | - raise ValueError( |
624 | | - "cannot combine transform and aggregation operations" |
625 | | - ) from err |
626 | | - return result |
627 | | - |
628 | | - |
629 | | -def agg_dict_like( |
630 | | - obj: AggObjType, |
631 | | - arg: AggFuncTypeDict, |
632 | | - _axis: int, |
633 | | -) -> FrameOrSeriesUnion: |
634 | | - """ |
635 | | - Compute aggregation in the case of a dict-like argument. |
636 | | -
|
637 | | - Parameters |
638 | | - ---------- |
639 | | - obj : Pandas object to compute aggregation on. |
640 | | - arg : dict |
641 | | - label-aggregation pairs to compute. |
642 | | - _axis : int, 0 or 1 |
643 | | - Axis to compute aggregation on. |
644 | | -
|
645 | | - Returns |
646 | | - ------- |
647 | | - Result of aggregation. |
648 | | - """ |
649 | | - is_aggregator = lambda x: isinstance(x, (list, tuple, dict)) |
650 | | - |
651 | | - if _axis != 0: # pragma: no cover |
652 | | - raise ValueError("Can only pass dict with axis=0") |
653 | | - |
654 | | - selected_obj = obj._selected_obj |
655 | | - |
656 | | - # if we have a dict of any non-scalars |
657 | | - # eg. {'A' : ['mean']}, normalize all to |
658 | | - # be list-likes |
659 | | - # Cannot use arg.values() because arg may be a Series |
660 | | - if any(is_aggregator(x) for _, x in arg.items()): |
661 | | - new_arg: AggFuncTypeDict = {} |
662 | | - for k, v in arg.items(): |
663 | | - if not isinstance(v, (tuple, list, dict)): |
664 | | - new_arg[k] = [v] |
665 | | - else: |
666 | | - new_arg[k] = v |
667 | | - |
668 | | - # the keys must be in the columns |
669 | | - # for ndim=2, or renamers for ndim=1 |
670 | | - |
671 | | - # ok for now, but deprecated |
672 | | - # {'A': { 'ra': 'mean' }} |
673 | | - # {'A': { 'ra': ['mean'] }} |
674 | | - # {'ra': ['mean']} |
675 | | - |
676 | | - # not ok |
677 | | - # {'ra' : { 'A' : 'mean' }} |
678 | | - if isinstance(v, dict): |
679 | | - raise SpecificationError("nested renamer is not supported") |
680 | | - elif isinstance(selected_obj, ABCSeries): |
681 | | - raise SpecificationError("nested renamer is not supported") |
682 | | - elif ( |
683 | | - isinstance(selected_obj, ABCDataFrame) and k not in selected_obj.columns |
684 | | - ): |
685 | | - raise KeyError(f"Column '{k}' does not exist!") |
686 | | - |
687 | | - arg = new_arg |
688 | | - |
689 | | - else: |
690 | | - # deprecation of renaming keys |
691 | | - # GH 15931 |
692 | | - keys = list(arg.keys()) |
693 | | - if isinstance(selected_obj, ABCDataFrame) and len( |
694 | | - selected_obj.columns.intersection(keys) |
695 | | - ) != len(keys): |
696 | | - cols = list( |
697 | | - safe_sort( |
698 | | - list(set(keys) - set(selected_obj.columns.intersection(keys))), |
699 | | - ) |
700 | | - ) |
701 | | - raise SpecificationError(f"Column(s) {cols} do not exist") |
702 | | - |
703 | | - from pandas.core.reshape.concat import concat |
704 | | - |
705 | | - if selected_obj.ndim == 1: |
706 | | - # key only used for output |
707 | | - colg = obj._gotitem(obj._selection, ndim=1) |
708 | | - results = {key: colg.agg(how) for key, how in arg.items()} |
709 | | - else: |
710 | | - # key used for column selection and output |
711 | | - results = {key: obj._gotitem(key, ndim=1).agg(how) for key, how in arg.items()} |
712 | | - |
713 | | - # set the final keys |
714 | | - keys = list(arg.keys()) |
715 | | - |
716 | | - # Avoid making two isinstance calls in all and any below |
717 | | - is_ndframe = [isinstance(r, ABCNDFrame) for r in results.values()] |
718 | | - |
719 | | - # combine results |
720 | | - if all(is_ndframe): |
721 | | - keys_to_use = [k for k in keys if not results[k].empty] |
722 | | - # Have to check, if at least one DataFrame is not empty. |
723 | | - keys_to_use = keys_to_use if keys_to_use != [] else keys |
724 | | - axis = 0 if isinstance(obj, ABCSeries) else 1 |
725 | | - result = concat({k: results[k] for k in keys_to_use}, axis=axis) |
726 | | - elif any(is_ndframe): |
727 | | - # There is a mix of NDFrames and scalars |
728 | | - raise ValueError( |
729 | | - "cannot perform both aggregation " |
730 | | - "and transformation operations " |
731 | | - "simultaneously" |
732 | | - ) |
733 | | - else: |
734 | | - from pandas import Series |
735 | | - |
736 | | - # we have a dict of scalars |
737 | | - # GH 36212 use name only if obj is a series |
738 | | - if obj.ndim == 1: |
739 | | - obj = cast("Series", obj) |
740 | | - name = obj.name |
741 | | - else: |
742 | | - name = None |
743 | | - |
744 | | - result = Series(results, name=name) |
745 | | - |
746 | | - return result |
0 commit comments