将函数应用于python中的数据框架列表



python初学者的问题,我已经从相关的堆栈问题中得到了答案。

I've got a list

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%置信区间。

我想要完成的是将dfList的每个项转换为其自身的一个版本,并将这些lowerRate, midRate和higherRate值附加为新列。

当我尝试使用

应用于每个数据帧时
for i in range(len(dfList):
rateCalc(dfList[i])

虽然,但似乎只有对df0执行。我完全搞不懂;我认为我在代码中有一些基本的缺陷,但它似乎适用于d0,然后不迭代到df1及以上。

我还认为可能有一个问题"df1 != dfList[1]"在某种后端意义上(在列表dfList[1]中的项上运行函数不会对原始项df1产生任何影响),但是,再一次,似乎与df0一起工作的事实意味着这不是问题。

我还试着用"地图"往墙上扔了一些泥。函数,但我不确定我理解如何在这种情况下使用它(或任何其他的问题)

谢谢所有的

我认为这是因为传递函数返回另一个只存在于函数范围内的数据帧,这里是一个例子

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如下

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

可以看到,id改变了。您可以尝试另一种归因方法,如下面的

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

现在id是相同的,并且新列存在于所有数据帧上。你的代码的第一个数据帧是如何工作的,我不知道。

最新更新