我正在尝试连接单行数据帧(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)
答案 0 :(得分:1)
我不相信依赖于全局变量的函数 - 它只是不好的卫生。
功能应该是纯粹的。首先,定义您的opt
功能。这只会生成df
而已。
def opt():
df = ... # df is generated here
return df
接下来,定义save_data
。好吧,我已将其重命名为augment
,以便更符合您的工作。这将两个DataFrame连接在一起。
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)
答案 1 :(得分:0)
将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
答案 2 :(得分:0)
这种方法避免使用全局变量。将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)