Python-функция, содержащая только цикл, возвращающий последний результат - PullRequest
0 голосов
/ 03 сентября 2018

При выполнении анализа данных с помощью модуля pandas в python я пытался создать функцию, которая может применить следующий процесс к списку фреймов данных. (Примечание: P1_Assessment - это один из фреймов данных, которые я хотел бы проанализировать.)

P1_Assessment[P1_Assessment > 1].sum(axis=0).astype(int).sort_values(ascending = False).plot(kind = 'bar')`

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

def assess_rep(dataframe):
for i in dataframe:
    a = i[i > 1].sum(axis= 0).astype(int).sort_values(ascending = False)
    a.plot(kind = 'bar')
return 

Но когда я использовал функцию в списке фреймов данных, был возвращен только проанализированный результат последнего фрейма данных. The picture of output from the console is attached here for clarity

Я пытался искать похожие темы в stackoverflow, но ничего не нашел, может быть, я пропустил. Любая помощь в этом очень ценится!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я перечислил два варианта.

Первый вариант - построить все кадры данных на одной фигуре:

def assess_rep(dataframe_list):
    for df in dataframe_list:
        a = df[df > 1].sum(axis= 0).astype(int).sort_values(ascending = False)
        ax = a.plot(kind = 'bar')
return ax

Вы можете сохранить рисунок в виде файла png:

ax = assess_rep(dataframe_list)
ax.get_figure().savefig('all_dataframe.png')

Второй вариант - построить каждый отдельный фрейм данных и сохранить рисунок во время процесса:

import matplotlib.pyplot as plt
def asses_rep(dataframe_list):
    ax_list = []
    counter = 1
    for df in dataframe_list:
        print(counter)
        fig = plt.figure(counter)
        a = df[df > 1].sum(axis= 0).astype(int).sort_values(ascending = False)
        ax = a.plot(kind='bar', fig=fig)
        ax_list.append(ax)
        ax.get_figure().savefig('single_df_%i.png'%counter)
        counter += 1
    return ax_list
0 голосов
/ 03 сентября 2018

Ваша проблема в том, что plot создает график, но когда вы снова вызываете его в цикле, он перезаписывает один вызов графика ранее. Итак, что вы хотите сделать, это сохранить каждый график в списке или что-то еще или сохранить их в виде файла с:

 p = a.plot()
 fig = p[0].get_figure()
 fig.savefig("filename.png")

извлечение savefig и DataFrame.plot редактирование занято из Как сохранить круговую диаграмму Pandas в файл?

...