Как я могу получить только кадр данных из функции, которая возвращает DF и график?

#python #matplotlib

Вопрос:

В настоящее время я работаю над функцией, которая return создает фрейм данных, но также содержит график matplotlib. Это выглядит примерно так:

 import pandas as pd
import matplotlib.pyplot as plt

def function(n):
    df = pd.DataFrame(columns=['a','b','c'])
    df['a'] = np.random.randn(n)
    df['b'] = np.random.randn(n)*2
    df['c'] = np.random.randn(n)*3
    plt.plot(df.a,color='red')
    plt.plot(df.b,color='green')
    plt.plot(df.c,color='blue')
    return(df)

function(100)
 

Проблема в том, что эта функция (по крайней мере, в Jupyter) выводит как график, так и кадр данных. Я хотел бы использовать фрейм данных ( df ) в качестве входных данных в другой функции, и мне не удалось успешно извлечь только фрейм данных для этой цели.

Я попытался использовать функцию(100)[0] и несколько ее вариаций, но безуспешно.

Я также понял, что размещение return(df) блока над plt.plot строками вернет только кадр данных, но не график, и я хотел бы, чтобы оба (кадр данных И график) отображались в выходной ячейке при вызове function .

Любая помощь будет признательна!

Ответ №1:

Вы можете изменить свою функцию, чтобы иметь возможность не создавать график:

 def function(n, plot=True):
    df = pd.DataFrame(columns=['a','b','c'])
    df['a'] = np.random.randn(n)
    df['b'] = np.random.randn(n)*2
    df['c'] = np.random.randn(n)*3
    if plot:
        plt.plot(df.a,color='red')
        plt.plot(df.b,color='green')
        plt.plot(df.c,color='blue')
    return(df)
 

Затем:

 >>> function(n)
# plot   output
>>> function(n, plot=False)
# output only
 

ПРИМЕЧАНИЕ. используйте def function(n, plot=False): , чтобы по умолчанию он не отображался

Ответ №2:

Вам нужно только добавить переменную, чтобы сохранить то, что возвращается функцией.

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def function(n):
    df = pd.DataFrame(columns=['a','b','c'])
    df['a'] = np.random.randn(n)
    df['b'] = np.random.randn(n)*2
    df['c'] = np.random.randn(n)*3
    plt.plot(df.a,color='red')
    plt.plot(df.b,color='green')
    plt.plot(df.c,color='blue')
    return(df)

new_df = function(10)
 

тогда new_df здесь только df.

Ответ №3:

Return заявление также позволяет диктовать.

  return {
         'my_df':df,
         'my_plot': plt.plot
         }
 

Затем вы можете получить доступ к содержимому с помощью:

 function_= function(100)
returned_df = function_['my_df']
returned_plot = function_['my_plot']