Pandas `.assign` нескольким столбцам из одной функции ⇐ Python
Pandas `.assign` нескольким столбцам из одной функции
У меня есть фрейм данных Pandas, который содержит один столбец val, а также функцию func, которая принимает значение и выдает список некоторой фиксированной длины ( скажем 4). У меня также есть список cols из 4 строк. Я хотел бы применить func к каждой ячейке и добавить 4 новых столбца, помеченных в соответствии с моим списком.
Похоже, что это работает примерно так:
импортировать панд как pd df = pd.DataFrame({'val': [1, 2, 4, 18, 9, 1]}) cols = ["X", "Y", "Z", "привет"] func = лямбда x: [2**x, str(x), x+1, "мир"] df[cols] = df['val'].apply(lambda val: pd.Series(func(val))) Поскольку я вижу, что все рекомендуют не использовать apply, я хотел попробовать сделать это с помощью assign. Я попытался назначить вывод func временному столбцу tmp, а затем извлечь отдельные значения одно за другим следующим образом:
импортировать панд как pd df = pd.DataFrame({'val': [1, 2, 4, 18, 9, 1]}) cols = ["X", "Y", "Z", "привет"] func = лямбда x: [2**x, str(x), x+1, "мир"] kwargs = {имя: (лямбда x: x.tmp[idx]) для idx, имя в перечислении (столбцы)} df[cols] = df.assign(tmp=lambda x: pd.Series(func(x.val)), **kwargs) Но это вызывает какую-то ошибку, которую я не знаю, как интерпретировать ValueError: Столбцы должны быть той же длины, что и ключ. Обратите внимание, что в документации к .assign [1] указано, что такой тип ссылки на себя разрешен, см. последний пример.
[1] https://pandas.pydata.org/docs/referenc ... ssign.html
РЕДАКТИРОВАТЬ: Для пояснения: в моем реальном приложении вызов func достаточно затратен, и я не хочу вызывать его четыре раза для каждой строки. Его также нелегко разделить на четыре подкомпонента, как в моем примере.
У меня есть фрейм данных Pandas, который содержит один столбец val, а также функцию func, которая принимает значение и выдает список некоторой фиксированной длины ( скажем 4). У меня также есть список cols из 4 строк. Я хотел бы применить func к каждой ячейке и добавить 4 новых столбца, помеченных в соответствии с моим списком.
Похоже, что это работает примерно так:
импортировать панд как pd df = pd.DataFrame({'val': [1, 2, 4, 18, 9, 1]}) cols = ["X", "Y", "Z", "привет"] func = лямбда x: [2**x, str(x), x+1, "мир"] df[cols] = df['val'].apply(lambda val: pd.Series(func(val))) Поскольку я вижу, что все рекомендуют не использовать apply, я хотел попробовать сделать это с помощью assign. Я попытался назначить вывод func временному столбцу tmp, а затем извлечь отдельные значения одно за другим следующим образом:
импортировать панд как pd df = pd.DataFrame({'val': [1, 2, 4, 18, 9, 1]}) cols = ["X", "Y", "Z", "привет"] func = лямбда x: [2**x, str(x), x+1, "мир"] kwargs = {имя: (лямбда x: x.tmp[idx]) для idx, имя в перечислении (столбцы)} df[cols] = df.assign(tmp=lambda x: pd.Series(func(x.val)), **kwargs) Но это вызывает какую-то ошибку, которую я не знаю, как интерпретировать ValueError: Столбцы должны быть той же длины, что и ключ. Обратите внимание, что в документации к .assign [1] указано, что такой тип ссылки на себя разрешен, см. последний пример.
[1] https://pandas.pydata.org/docs/referenc ... ssign.html
РЕДАКТИРОВАТЬ: Для пояснения: в моем реальном приложении вызов func достаточно затратен, и я не хочу вызывать его четыре раза для каждой строки. Его также нелегко разделить на четыре подкомпонента, как в моем примере.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Поиск pandas по нескольким столбцам возвращает один столбец, если совпадает
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-