Применить функцию возврата списка ко всем строкам в DataFrame pandas

Мне нужно применить функцию и вставить значения возвращаемого списка в столбцы в (новом) кадре данных. То есть, если у меня есть это:

import pandas as pd
def fu(myArg):
    return {"one":myArg,"two":20}
li = [10,20]
df = pd.DataFrame(li,columns=["myArg"])

я хотел бы применить функцию fu к каждой строке кадра данных, чтобы результат был:

    myArg   one two
0   10      10  20
1   20      20  20

(извините за лишние пробелы, добавлены для наглядности).

Как мне это сделать эффективно?

Я не уверен, что понимаю, что вам нужно, но отмечу, что fu возвращает dict, а не list

JRiggles 01.07.2024 20:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Заставьте свою функцию возвращать Series, подать заявку , затем присоединиться:

def fu(myArg):
    return pd.Series({'one': myArg, 'two': 20})

out = df.join(df['myArg'].apply(fu))

Если вы не можете изменить функцию:

def fu(myArg):
    return {'one': myArg, 'two': 20}

out = df.join(df['myArg'].apply(lambda x: pd.Series(fu(x))))

Или преобразуйте серию словарей в DataFrame с помощью json_normalize (предупреждение, json_normalize не поддерживает индекс, вам нужно установить его вручную!):

def fu(myArg):
    return {'one': myArg, 'two': 20}

out = df.join(pd.json_normalize(df['myArg'].apply(fu)).set_index(df.index))

Выход:

   myArg  one  two
0     10   10   20
1     20   20   20

Судя по вашим данным, столбец myArg представляет собой не что иное, как копию li, а столбец two имеет одинаковое значение во всех строках. Если это так, почему бы вам просто не сделать:

out = pd.DataFrame({"one" : li, "two" : 20})

может быть нечто большее, чем вы не описали в своем вопросе.

Да, это всего лишь воспроизводимый пример. Мне нужно применить функцию, которая возвращает dict/list в фрейм данных по строкам, и распределить результаты по столбцам в фрейме данных. Я не просто хочу преобразовать список в DataFrame.

Fredrik Nylén 02.07.2024 20:28

Спасибо @mozway, проблема заключалась в том, что мне нужно было вернуть серию pandas. Как только это будет достигнуто, вы можете использовать подход на основе объединения или одиночный вызов, например

dfout = df.apply(lambda x: fu(x['myArg']),result_type = "expand",axis=1)

что в моих небольших тестах кажется немного быстрее.

В любом случае, благодарю Вас!

Другие вопросы по теме