Выполнять условные итерации и выводить кадры данных и диаграммы - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь вывести фрейм данных и диаграмму для каждого из моих значений.Я изо всех сил пытаюсь собрать воедино некоторые из этих основ Pythonic.

Поток: я беру фрейм данных, делаю группу, получаю процент от общего числа ... Вывод таблицы и диаграммы.Тем не менее, я хочу повторить этот процесс, сначала с фильтром данных на Reviewed?=='Yes', а затем No.

data = {'Region': ["US", "US", "US","US"],
        'Gender': ["M","F","F","M"],
        'Reviewed?': ["Yes","Yes","No","No"]}
df = pd.DataFrame(data, columns=['Region','Gender','Reviewed?'])

def func(df):
    vals = ['Yes','No']
    for i in range(len(vals)):
        for x in vals:
            gb[i] = df[df['Reviewed?']==x].groupby(['Gender'])['Region'].count().reset_index()
            total[i] = gb[i]['Region'].sum()
            gb[i]['Percentage'] = (gb[i]['Region'] / total[i])
            gb[i] = gb[i].sort_values(by='Percentage', ascending=False)
            sns.barplot(data=gb[i], x='Region', y='Percentage')
    plt.show()
    return gb[i]

несколько сообщений об ошибках:

ValueError: could not broadcast input array from shape (0,2) into shape (0)

ValueError: cannot copy sequence with size 2 to array axis with dimension 0

ValueError: Cannot set a frame with no defined index and a value that cannot be converted to a Series

Обновление Вот грубая версия того, что я хочу.Мне просто нужен более эффективный и динамичный способ сделать это.

Заметьте, я изначально не указывал явно, что я хотел сохранить счет в конечном кадре данных ...

import pandas as pd
import seaborn as sns

data = {'Region': ["US", "US", "US","US"],
        'Gender': ["M","F","F","M"],
        'Reviewed?': ["Yes","Yes","No","No"]}
df = pd.DataFrame(data, columns=['Region','Gender','Reviewed?'])

def func(df):
    gb = df[df['Reviewed?']=='No'].groupby(['Gender'])['Region'].count().reset_index()
    total = gb['Region'].sum()
    gb['Percentage'] = (gb['Region'] / total)
    notyetreviewed = gb.sort_values(by='Percentage', ascending=False)
    sns.barplot(data=notyetreviewed, x='Gender', y='Percentage')
    bottom, top = plt.ylim(0,1) 
    plt.show()

    gb = df[df['Reviewed?']=='Yes'].groupby(['Gender'])['Region'].count().reset_index()
    total = gb['Region'].sum()
    gb['Percentage'] = (gb['Region'] / total)
    reviewed = gb.sort_values(by='Percentage', ascending=False)
    bottom, top = plt.ylim(0,1)  
    sns.barplot(data=reviewed, x='Gender', y='Percentage')
    plt.show()

    return notyetreviewed, reviewed
func(df)

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Это незначительное улучшение.Было бы неплохо увидеть более Pythonic решение, которое бы не требовало от меня жесткого кода 'Reviewed?' в вызове функции ...

import pandas as pd
import seaborn as sns

data = {'Region': ["US", "US", "US","US"],
        'Gender': ["M","F","F","M"],
        'Reviewed?': ["Yes","Yes","No","No"]}
df = pd.DataFrame(data, columns=['Region','Gender','Reviewed?'])

def func(df,group,reviewed):
    df = df[df['Reviewed?'].isin(reviewed)].groupby([group])['Region'].count().reset_index()
    df['Percentage'] = df['Region'] / df['Region'].sum()
    sns.barplot(data=df, x='Gender', y='Percentage')
    bottom, top = plt.ylim(0,1)
    plt.show()
    return df

df1 = func(df,'Gender',['Yes'])
df1 = func(df,'Gender',['No'])
0 голосов
/ 03 марта 2019

Вы можете попробовать что-то вроде этого:

import pandas as pd

data = {'Region': ["US", "US", "US","US"],
        'Gender': ["M","F","F","M"],
        'Reviewed?': ["Yes","Yes","No","No"]}
df = pd.DataFrame(data, columns=['Region','Gender','Reviewed?'])

for outcome in ['Yes', 'No']:
    filtered = df[df['Reviewed?'].eq(outcome)]['Gender'].value_counts(normalize=True)
    filtered.plot.bar()

В этом случае я фильтрую DF в каждом цикле по результату Reviewed?, а затем получаю пропорциональные значения для мужчин и женщин.Ваш вопрос представляет собой бинарный выбор, но я полагаю, он может быть расширен на for outcome in df['Reviewed?'].unique():

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...