Stacked Plot代表年龄组的性别来自包含Python / Pandas / Matplotlib上的标识符,年龄和性别的CSV

时间:2016-12-14 13:20:21

标签: python pandas matplotlib data-analysis

我有年龄,性别(男性,女性)和标识符的csv数据。我按照

上的pandas上的标识符计数对个体的年龄和性别进行了分组
counts = df.groupby(['Age','Gender']).count()
print counts

结果看起来像这样:

Age Gender      Id_count       
15  W                 1
17  M                 1
19  M                 2
20  M                 6
    W                 1
21  M                 3
    W                 1
23  M                 4
    W                 3
24  M                 8
    W                 3
25  M                 9
26  M                 6
    W                 1
27  M                 3
    W                 1
28  M                 9
    W                 2
29  M                 5
    W                 1
30  M                 3
31  M                 9
    W                 1 ..

我的数据集上的独特年龄是从15岁到90岁。我现在想要在最后使用叠加的情节进行年龄组分析。为此,我想让我们说年龄范围到特定年龄组(10- 20,21-30,31-40等)和每个年龄组的标识符的总和,显示在栏顶部的总和,我的目的是为代表男性和女性的堆积条获得两种不同的颜色id_count的比例。为了实现这个:我创建了一个字典,我给出了范围,如下所示..

df['ids_counted']= np.round(df['Age'])
categories_dict = { 15 : 'Between 10 and 20',
                    16 : 'Between 10 and 20',
                    17 : 'Between 10 and 20',
                    18 : 'Between 10 and 20',
                    19 : 'Between 10 and 20',
                    20 : 'Between 10 and 20',
                    21 : 'Between 21 and 30',
                    22 : 'Between 21 and 30',..
                    90 : 'Between 81 and 90',} 

然后我创建了这个数据帧。

df['category'] = df['id_counted'].map(categories_dict)
count2 = df.groupby(['category','Age','Gender','Id_Count']).count()
total= count2.sum(level= 0)
print total

现在我已经成功计算了每个年龄组的标识符总数。它看起来像这样:

Between 10 and 20                           11
Between 21 and 30                           62
Between 31 and 40                           82
Between 41 and 50                          120
Between 51 and 60                          125
Between 61 and 70                          141
Between 71 and 80                          192
Between 81 and 90                           38

但我在这里迷路了,因为我也想描绘性别。让我们的年龄在10到20之间。总计11应该在我的酒吧的顶部,9部分男性和2名女性应该在堆积的酒吧上绘制。我想到了另一种方法,因为我认为这种方法不会让我得到我的结果。我生成了一个分组的数据框,其中包含每个年龄的每个M和F的计数,然后计算每个年龄组的个人总数。

totals = counts.sum(level=0)

现在要绘制:

plt.bar(ages, counts['M'], bottom=None, color='blue', label='M')
plt.bar(ages, counts['W'], bottom=counts['M'], color='red', label='W')
plt.legend()
plt.xlabel('Age Group')
plt.ylabel('Occurences Of Identifiers')
plt.title('ttl',fontsize=20)


for age,tot in zip(ages,totals.values.flatten()):
    plt.annotate('{:d}'.format(tot), xy=(age+0.39, tot), xytext=(0,1), textcoords='offset points', ha='center', va='bottom')

plt.show()
plt.save()
plt.close()

并得到了这个情节,结果证明是正常的enter image description here,但这是针对个人年龄而我的目标是在我的字典上为年龄组生成相同的情节。如果有人建议我或给我一个想法来获得我的目标结果,我将非常感激。非常感谢您的参与。

2 个答案:

答案 0 :(得分:2)

使用np.digitize可以更轻松地指定年龄组。

'ssh-keygen' is not recognized as an internal or external command, 
operable program or batch file.

现在按类别和性别统计分组,然后将结果取消堆叠以将性别作为列。

n = 100
age = np.random.randint(15, 91, size=n)
gender = np.random.randint(2, size=n)
df = pd.DataFrame.from_items([('Age', age), ('Gender', gender)])
bins = np.arange(1, 10) * 10
df['category'] = np.digitize(df.Age, bins, right=True)
print(df.head())

   Age  Gender  category
0   22       1         2
1   54       0         5
2   85       1         8
3   77       0         7
4   86       1         8

绘图现在变得轻而易举。

counts = df.groupby(['category', 'Gender']).Age.count().unstack()
print(counts)

Gender     0  1
category       
1          2  7
2          7  5
3          6  4
4         11  9
5          5  8
6          2  4
7         10  7
8          6  7

enter image description here

答案 1 :(得分:0)

最后证明这是我的代码:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.style.use('fivethirtyeight')

df = pd.read_csv('/home/Desktop/cocktail_ids_age_gender.csv')
df.values


bins = np.arange(10, 100, 10)

df['category'] = np.digitize(df.Age, bins, right=True)

counts = df.groupby(['category', 'Gender']).Age.count().unstack()
print(counts)

ax = counts.plot(kind='bar',stacked = False, colormap = 'Paired')

for p in ax.patches:
        ax.annotate(np.round(p.get_height(),decimals=0).astype(np.int64), (p.get_x()+p.get_width()/2., p.get_height()), ha='center', va='center', xytext=(2, 10), textcoords='offset points')

plt.xlabel ('Age Group')
plt.ylabel ('Co-Occurences ')
plt.title('Comparison Of Occurences  In An Age Group',fontsize=20)
plt.show()

enter image description here我决定让它堆叠,因为它使分析更容易。由于goyo,一切都很顺利。但唯一困扰我的是我的x轴。而不是显示1,2,3,4 ..我想显示10-20,20-30等。我不知道我怎么能这样做。谁能帮我。谢谢