我正在尝试连接单行数据帧 (df) 并将其添加到另一个数据帧 (df_all) 的末尾,使用以下代码:
import pandas as pd
import numpy as np
from IPython.display import display, HTML
global df_all
df_all = pd.DataFrame()
def save_data(df):
df_all = pd.concat([df, df_all], axis=0)
display(df_all)
return df_all
def opt():
df = pd.DataFrame(np.random.randn(1, 4), columns=list('ABCD')) # one row data
display(df)
save_data(df)
使用此循环,我想将 3 行保存到df_all。但是我收到一条错误消息(分配前引用的局部变量"df_all")
for i in range (3):
opt()
display(df_all)
我不相信依赖于全局变量的函数——它只是不卫生。
函数应该是纯粹的。首先,定义opt
函数。这只会产生df
,仅此而已。
def opt():
df = ... # df is generated here
return df
接下来,定义save_data
。好吧,我已将其重命名为augment
,以更符合您正在做的事情。这会将两个数据帧连接在一起。
def augment(df, df_new):
return pd.concat([df, df_new], axis=1)
最后,你的主循环。所有状态都在这里维护,而不是在函数中—
df_all = pd.DataFrame()
for i in range(3):
df_all = augment(df_all, opt())
display(df_all)
global df_all
移动到save_data(df)
块。
def save_data(df):
global df_all
df_all = pd.concat([df, df_all], axis=0)
display(df_all)
return df_all
此方法避免使用全局变量。将df_all作为参数传递给 opt()。
def save_data(df, df_all):
df_all = pd.concat([df, df_all], axis=0)
return df_all
def opt(df_all):
df = pd.DataFrame(np.random.randn(1, 4), columns=list('ABCD')) # one row data
df_all = save_data(df, df_all)
return df_all
df_all = pd.DataFrame()
for i in range(3):
df_all = opt(df_all)
display(df_all)