Как я могу использовать пользовательские группы и groupby.agg для объединения строк в df путем объединения определенных ⇐ Python
Как я могу использовать пользовательские группы и groupby.agg для объединения строк в df путем объединения определенных
Это своего рода продолжение предыдущего вопроса, который я задал чуть больше года назад
У меня есть «основной» фрейм данных, в котором указаны коды продуктов и названия множества материалов, а также их ежемесячное потребление. что-то вроде:
код продукта Имя Потребление А Потребление Б Потребление C Потребление D 123 АА 100 120 130 140 456 ББ 5 7 9 11 789 CC 12 5 33 89 134 AD 4 17 37 57 467 БД 1 3 5 7 179 ЭД 6 19 30 61 426 ФД 8 5 2 13
И еще у меня есть вторая таблица со списком некоторых кодов продуктов, которые являются «альтернативами» или заменителями, например:
Код продукта Альтернативный код 123 134 123 179 123 426 456 467
(Отличие от предыдущего в том, что теперь один и тот же «Код продукта» может иметь несколько разных «Альтернативных кодов»)
Как я могу использовать этот второй фрейм данных для обработки первого, чтобы он стал следующим:
код продукта Имя Потребление А Потребление Б Потребление C Потребление D 123/134/179/426 AA / AD / ED / FD 118 161 199 271 456/467 ББ/БД 6 10 14 18 789 CC 12 5 33 89
где коды и названия продуктов были объединены в одну ячейку, количества суммированы, а «дубликаты» альтернатив удалены?
В отличие от прошлого раза, теперь есть места, где один «основной» код имеет несколько альтернатив, но они всегда будут указаны с основным кодом в первом столбце и альтернативой в столбце «альтернативный код». В идеале мне хотелось бы объединить все альтернативные строки в одну, используя один и тот же фрагмент кода.
Это код, который я пытался использовать, основываясь на ответе, полученном в прошлый раз:
if alt_name != "": altf = pd.read_excel(io=alt_name) group = df['Материал'].map(лямбда x: altf.set_index('Материал')['Альтернативный материал'].get(x, x)) d = {c: 'сумма' для c в df.columns} выход = (df .astype({'Материал': str}) .groupby([группа], as_index=False) .agg({**d, **{'Материал': ' / '.join, 'Описание': ' / '.join}}) ) df = выход alt_name — имя листа Excel со столбцами, сохраненное как «Материал». и «Альтернативный материал».
когда я пытаюсь запустить его с таблицей с несколькими альтернативами, я получаю следующую ошибку:
Traceback (самый последний вызов — последний): Файл "/Users/[Location]/function_code_v2.py", строка 285, в диаграммы трендов (имя_файла, зона, объединения зон, месяц, число месяцев, процент_желаний, трендген, альтернативное_имя, каталог_сохранения) Файл «/Users/[Location]/function_code_v2.py», строка 106, в диаграммах трендов. .agg({**d, **{'Материал': ' / '.join, 'Описание': ' / '.join}}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ Файл "/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/generic.py", строка 1445, в совокупности результат = оп.agg() ^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 175, в agg вернуть self.agg_dict_like() ^^^^^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 406, в agg_dict_like вернуть self.agg_or_apply_dict_like(op_name="agg") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 1388, в agg_or_apply_dict_like result_index, result_data = self.compute_dict_like( ^^^^^^^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 480, в Compute_dict_like getattr(obj._gotitem(key, ndim=1), op_name)(как, **kwargs) Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/generic.py», строка 275, в совокупности если self.ngroups == 0: ^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/groupby.py», строка 825, в ngroups вернуть self.grouper.ngroups ^^^^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/ops.py», строка 758, в ngroups вернуть len(self.result_index) ^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/ops.py», строка 769, в result_index вернуть self.groupings[0].result_index.rename(self.names[0]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/grouper.py», строка 718, в result_index вернуть self.group_index ^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/grouper.py», строка 722, в group_index коды, уникальные символы = self._codes_and_uniques ^^^^^^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/grouper.py», строка 801, в _codes_and_uniques коды, уникальные значения = алгоритмы.факторизация( # тип: игнорировать[назначение] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/algorithms.py", строка 795, в факторизации коды, уникальные значения = Factorize_array( ^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/algorithms.py», строка 595, в Factorize_array уникальные, коды = table.factorize( ^^^^^^^^^^^^^^^^^ Файл «pandas/_libs/hashtable_class_helper.pxi», строка 7280, в pandas._libs.hashtable.PyObjectHashTable.factorize Файл «pandas/_libs/hashtable_class_helper.pxi», строка 7194, в pandas._libs.hashtable.PyObjectHashTable._unique TypeError: нехешируемый тип: «Серия»
Это своего рода продолжение предыдущего вопроса, который я задал чуть больше года назад
У меня есть «основной» фрейм данных, в котором указаны коды продуктов и названия множества материалов, а также их ежемесячное потребление. что-то вроде:
код продукта Имя Потребление А Потребление Б Потребление C Потребление D 123 АА 100 120 130 140 456 ББ 5 7 9 11 789 CC 12 5 33 89 134 AD 4 17 37 57 467 БД 1 3 5 7 179 ЭД 6 19 30 61 426 ФД 8 5 2 13
И еще у меня есть вторая таблица со списком некоторых кодов продуктов, которые являются «альтернативами» или заменителями, например:
Код продукта Альтернативный код 123 134 123 179 123 426 456 467
(Отличие от предыдущего в том, что теперь один и тот же «Код продукта» может иметь несколько разных «Альтернативных кодов»)
Как я могу использовать этот второй фрейм данных для обработки первого, чтобы он стал следующим:
код продукта Имя Потребление А Потребление Б Потребление C Потребление D 123/134/179/426 AA / AD / ED / FD 118 161 199 271 456/467 ББ/БД 6 10 14 18 789 CC 12 5 33 89
где коды и названия продуктов были объединены в одну ячейку, количества суммированы, а «дубликаты» альтернатив удалены?
В отличие от прошлого раза, теперь есть места, где один «основной» код имеет несколько альтернатив, но они всегда будут указаны с основным кодом в первом столбце и альтернативой в столбце «альтернативный код». В идеале мне хотелось бы объединить все альтернативные строки в одну, используя один и тот же фрагмент кода.
Это код, который я пытался использовать, основываясь на ответе, полученном в прошлый раз:
if alt_name != "": altf = pd.read_excel(io=alt_name) group = df['Материал'].map(лямбда x: altf.set_index('Материал')['Альтернативный материал'].get(x, x)) d = {c: 'сумма' для c в df.columns} выход = (df .astype({'Материал': str}) .groupby([группа], as_index=False) .agg({**d, **{'Материал': ' / '.join, 'Описание': ' / '.join}}) ) df = выход alt_name — имя листа Excel со столбцами, сохраненное как «Материал». и «Альтернативный материал».
когда я пытаюсь запустить его с таблицей с несколькими альтернативами, я получаю следующую ошибку:
Traceback (самый последний вызов — последний): Файл "/Users/[Location]/function_code_v2.py", строка 285, в диаграммы трендов (имя_файла, зона, объединения зон, месяц, число месяцев, процент_желаний, трендген, альтернативное_имя, каталог_сохранения) Файл «/Users/[Location]/function_code_v2.py», строка 106, в диаграммах трендов. .agg({**d, **{'Материал': ' / '.join, 'Описание': ' / '.join}}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ Файл "/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/generic.py", строка 1445, в совокупности результат = оп.agg() ^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 175, в agg вернуть self.agg_dict_like() ^^^^^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 406, в agg_dict_like вернуть self.agg_or_apply_dict_like(op_name="agg") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 1388, в agg_or_apply_dict_like result_index, result_data = self.compute_dict_like( ^^^^^^^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/apply.py», строка 480, в Compute_dict_like getattr(obj._gotitem(key, ndim=1), op_name)(как, **kwargs) Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/generic.py», строка 275, в совокупности если self.ngroups == 0: ^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/groupby.py», строка 825, в ngroups вернуть self.grouper.ngroups ^^^^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/ops.py», строка 758, в ngroups вернуть len(self.result_index) ^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/ops.py», строка 769, в result_index вернуть self.groupings[0].result_index.rename(self.names[0]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/grouper.py», строка 718, в result_index вернуть self.group_index ^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/grouper.py», строка 722, в group_index коды, уникальные символы = self._codes_and_uniques ^^^^^^^^^^^^^^^^^^^^^^^ Файл «properties.pyx», строка 36, в pandas._libs.properties.CachedProperty.__get__ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/groupby/grouper.py», строка 801, в _codes_and_uniques коды, уникальные значения = алгоритмы.факторизация( # тип: игнорировать[назначение] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/algorithms.py", строка 795, в факторизации коды, уникальные значения = Factorize_array( ^^^^^^^^^^^^^^^^^ Файл «/Users/[Location]/.venv/lib/python3.12/site-packages/pandas/core/algorithms.py», строка 595, в Factorize_array уникальные, коды = table.factorize( ^^^^^^^^^^^^^^^^^ Файл «pandas/_libs/hashtable_class_helper.pxi», строка 7280, в pandas._libs.hashtable.PyObjectHashTable.factorize Файл «pandas/_libs/hashtable_class_helper.pxi», строка 7194, в pandas._libs.hashtable.PyObjectHashTable._unique TypeError: нехешируемый тип: «Серия»
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Несколько агрегаций одного и того же столбца с использованием pandas GroupBy.agg()
Anonymous » » в форуме Python - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-