用pandas group by绘制总计的百分比

时间:2017-12-01 00:32:38

标签: python pandas matplotlib

我正在尝试绘制一个pandas数据框的条形图,这是两个分组的结果。

特别是,我的数据框看起来与另一个SO帖子的答案(https://stackoverflow.com/a/23377155/7243972)的输出完全相同:

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

np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
               'office_id': list(range(1, 7)) * 2,
               'sales': [np.random.randint(100000, 999999) for _ in range(12)]})

state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
state = df.groupby(['state']).agg({'sales': 'sum'})
results = state_office.div(state, level='state') * 100

我想绘制results,以便每个state都是不同的颜色,office_id位于x轴上。这样可以将每个office_id组合在一起,并且可以轻松比较它们。

我已尝试从results['sales'].plot.bar()调整情节,但我正在努力。

2 个答案:

答案 0 :(得分:1)

首先,您需要展平数据框:

data = []
for row in results.iterrows():
    state, office_id = row[0]
    sales = row[1][0]
    data.append((state, office_id, sales))
flat_df = pd.DataFrame(data, columns=['state', 'office_id', 'sales'])

然后绘制

import seaborn as sns
sns.set(style="whitegrid")

g = sns.factorplot(x="office_id", y="sales", hue="state", data=flat_df, kind="bar", palette="muted")

编辑:刚刚意识到有一种更简单的方法来展平数据帧:

flat_df = results.reset_index(inplace=False)

答案 1 :(得分:0)

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

np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
               'office_id': list(range(1, 7)) * 2,
               'sales': [np.random.randint(100000, 999999) for _ in 
range(12)]})

state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
state = df.groupby(['state']).agg({'sales': 'sum'})

results = state_office.div(state, level='state') * 100
results = results.reset_index()

fig, ax = plt.subplots()
for c, df in results.groupby('state'):
    ax.scatter(df['office_id'], df['sales'], label=c)
ax.legend()
ax.set_title('Scatterplot')
ax.set_xlabel('office_id')
ax.set_ylabel('sales')

这会打印一个散点图。看看你是否可以从这里拿走它!