【发布时间】:2019-07-24 14:36:58
【问题描述】:
我正在尝试为我的每个“vals”输出一个数据框和一个图表。我正在努力拼凑一些 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)
【问题讨论】:
-
您无法在单个代码运行中获得 3 个
ValueErrors。它是哪一个?感谢您尝试说明各种尝试 -
所以,我们这里应该有 2 个图表,每个图表显示 M/F 的 50/50 拆分?
-
ha,显然你在这方面没有我那么糟糕 :) 在第一个值错误之后,我得到:“在处理上述异常期间,发生了另一个异常:”同样的事情发生在第二个值错误。
-
是的,我只是为可重现的代码添加了一些虚拟数据。
-
我试图修复您的缩进,因为它在
func中缩进了很远,请检查并确保它仍然正确。
标签: python pandas for-loop seaborn