Конкатенация DataFrames с помощью вызовов функций - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь объединить однорядный фрейм данных (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 голосов
/ 17 мая 2018

Я не верю в функции, которые полагаются на глобальные переменные - это просто плохая гигиена.

Функции должны быть чистыми.Сначала определите вашу opt функцию.Это просто генерирует df и больше ничего.

def opt():
    df = ...  # df is generated here
    return df

Далее определите save_data.Ну, я переименовал его в augment, чтобы больше соответствовать тому, что вы делаете.Это объединяет два DataFrames вместе.

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)
0 голосов
/ 17 мая 2018

Этот подход позволяет избежать использования глобальной переменной. Передайте 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)
0 голосов
/ 17 мая 2018

переместить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...