Применение функции к списку фреймов данных в python

здесь возникает вопрос о питоне для начинающих, на который мне было трудно получить ответ из связанных вопросов о стеке.

у меня есть список

dfList = df0,df1,df2,...,df7

У меня есть функция, которую я определил и принимает в качестве аргумента фрейм данных. Я не уверен, что сама функция имеет значение, но, чтобы быть в безопасности, в основном

def rateCalc (outcomeDataFrame):
    rateList = list()
    upperRateList = list()
    lowerRateList = list()
    for i in range(len(outcomeDataFrame)):
        lowlevel, highlevel = proportion_confint(count=outcomeDataFrame.iloc[i,4], nobs=outcomeDataFrame.iloc[i,3])
        lowerRateList.append(lowlevel)
        rateList.append(outcomeDataFrame.iloc[i,4]/outcomeDataFrame.iloc[i,3])
        upperRateList.append(highlevel)

    outcomeDataFrame = outcomeDataFrame.assign(lowerRate=lowerRateList)
    outcomeDataFrame = outcomeDataFrame.assign(midrate=rateList)
    outcomeDataFrame = outcomeDataFrame.assign(upperRate=upperRateList)

    return outcomeDataFrame

То, что я пытаюсь сделать, это добавить наблюдаемый коэффициент успеха двух чисел, а также их доверительный интервал 95%. Идет нормально при работе с любыми отдельными df.

Чего я хочу добиться, так это превратить каждый элемент dfList в версию самого себя с этими значениями lowerRate, midRate и highRate, добавленными в качестве новых столбцов.

Когда я пытаюсь применить к каждому кадру данных с помощью

for i in range(len(dfList):
   rateCalc(dfList[i])

хотя, похоже, он выполняется только для df0. Я не могу понять это; полная ошибка Я предполагаю, что у меня есть какой-то основной недостаток в коде, но, похоже, он работает для df0, а затем не переходит к df1 и выше.

Я также подумал, что может быть проблема «df1 != dfList[1]» в каком-то внутреннем смысле (что запуск функции для элемента в списке dfList[1] не окажет никакого влияния на исходный элемент df1), но, опять же, тот факт, что он работает с df0, означает, что это не проблема.

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

Спасибо всем

df не существует в вашем примере. Возможно, вы хотите for df in dfList: rateCalc(df).
tdelaney 22.11.2022 21:35

@tdelaney спасибо, я отредактировал, чтобы исправить эту ошибку - я имел в виду, что цикл for будет работать с dfList[i], как в dfList[0] = df0, dfList[1] = df[1] и так далее.

kpdawson24 22.11.2022 21:43

Он должен работать. Возможно, вам потребуется опубликовать рабочий пример, чтобы мы могли обнаружить ошибки. Вы можете добавить print(i, id(dfList[i])), чтобы убедиться, что список настроен правильно.

tdelaney 22.11.2022 22:11

Является ли функция proportion_confint сложной? Можете ли вы опубликовать пример?

tdelaney 22.11.2022 22:12

возможно for i in range(len(dfList)): dfList[i] = rateCalc(dfList[i]) это то, что вы хотите. Это не объясняет только обработку df0, но объясняет, почему ни один из них не обновляется.

tdelaney 22.11.2022 22:38

@marcio sczepanski, это действительно было проблемой. у меня были некоторые неаккуратные глобальные и локальные переменные. спасибо!

kpdawson24 23.11.2022 08:05
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я думаю, это потому, что функция assing возвращает другой фрейм данных, который существует только внутри области действия функции, вот пример

import pandas as pd
df_0 = pd.DataFrame(data = [{'column':'a'}])
df_1 = pd.DataFrame(data = [{'column':'c'}])
df_2 = pd.DataFrame(data = [{'column':'d'}])
df_altos = df_0,df_1,df_2

def mod_df(df):
    test = list()
    test.append('d')
    #print('id before setting another column '+str(id(df)))
    #df['b'] = test
    print('id before assinging '+str(id(df)))
    df = df.assign(lowerRate = test)
    print('id after  assinging '+str(id(df)))
    return df

for i in range(len(df_altos)):
    mod_df(df_altos[i])

Возвращаемый идентификатор каждого фрейма данных следующий

id before assinging 1833832455136
id after  assinging 1833832523568
id before assinging 1833832456144
id after  assinging 1833832525776
id before assinging 1833832454416
id after  assinging 1833832521888

Как видите, идентификатор меняется. Вы можете попробовать другой метод атрибуции, как показано ниже.

def mod_df(df):
    test = list()
    test.append('d')
    print('id before setting another column '+str(id(df)))
    df['b'] = test
    print('id after assinging '+str(id(df)))
    return df

который выводит

id before setting another column 1833831955520
id after assinging 1833831955520
id before setting another column 1833791973888
id after assinging 1833791973888
id before setting another column 1833791973264
id after assinging 1833791973264

Теперь идентификаторы одинаковы, и новый столбец существует во всех кадрах данных. Как работал первый фрейм данных вашего кода, я не знаю.

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