Я пытаюсь вывести фрейм данных и диаграмму для каждого из моих значений.Я изо всех сил пытаюсь собрать воедино некоторые из этих основ 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)