здесь возникает вопрос о питоне для начинающих, на который мне было трудно получить ответ из связанных вопросов о стеке.
у меня есть список
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, означает, что это не проблема.
Я также пытался полить грязью стену с помощью функции «карта», но не уверен, что понимаю, как ее использовать в этом контексте (или в любом другом, если на то пошло, ха)
Спасибо всем
@tdelaney спасибо, я отредактировал, чтобы исправить эту ошибку - я имел в виду, что цикл for будет работать с dfList[i], как в dfList[0] = df0, dfList[1] = df[1] и так далее.
Он должен работать. Возможно, вам потребуется опубликовать рабочий пример, чтобы мы могли обнаружить ошибки. Вы можете добавить print(i, id(dfList[i]))
, чтобы убедиться, что список настроен правильно.
Является ли функция proportion_confint
сложной? Можете ли вы опубликовать пример?
возможно for i in range(len(dfList)): dfList[i] = rateCalc(dfList[i])
это то, что вы хотите. Это не объясняет только обработку df0, но объясняет, почему ни один из них не обновляется.
@marcio sczepanski, это действительно было проблемой. у меня были некоторые неаккуратные глобальные и локальные переменные. спасибо!
Я думаю, это потому, что функция 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
Теперь идентификаторы одинаковы, и новый столбец существует во всех кадрах данных. Как работал первый фрейм данных вашего кода, я не знаю.
df
не существует в вашем примере. Возможно, вы хотитеfor df in dfList: rateCalc(df)
.