通过函数调用连接DataFrame

时间:2018-05-17 01:34:15

标签: python pandas function dataframe concatenation

我正在尝试连接单行数据帧(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)

3 个答案:

答案 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)