Мне нужно применить функцию и вставить значения возвращаемого списка в столбцы в (новом) кадре данных. То есть, если у меня есть это:
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
(извините за лишние пробелы, добавлены для наглядности).
Как мне это сделать эффективно?
Заставьте свою функцию возвращать 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.
Спасибо @mozway, проблема заключалась в том, что мне нужно было вернуть серию pandas. Как только это будет достигнуто, вы можете использовать подход на основе объединения или одиночный вызов, например
dfout = df.apply(lambda x: fu(x['myArg']),result_type = "expand",axis=1)
что в моих небольших тестах кажется немного быстрее.
В любом случае, благодарю Вас!
Я не уверен, что понимаю, что вам нужно, но отмечу, что
fu
возвращаетdict
, а неlist