使用全等x值绘制python中的绘图

时间:2014-02-06 19:29:39

标签: python matplotlib pandas

目标:在同一图表上获取两个不同的名称。确保岁月排队。请注意,该文件不会有两年(当给女孩和男孩一个名字时),在这种情况下,为每个名字添加所有分年的值。

当前状态:一个名称正在运行。两个名称将索引更改为行号而不是年号。

Y:'prop'==名称(不分性别)与当年给新生儿的所有名字的比例。

X:'年'==出生证明年

https://raw2.github.com/hadley/data-baby-names/master/baby-names.csv

有csv

CODE:

import pandas
import pylab
import matplotlib
from pandas import *
from pylab import *
from matplotlib import *

names = read_csv(r'C:\Users\joe\Documents\Python\baby-names2.csv')


import matplotlib as mpl
import matplotlib.pyplot as plt



resultAry = names[names.name.isin(['Joseph', 'Nancy'])].set_index(['year','name'])['prop']

print (resultAry.head())
print ('***************')
resultAry = resultAry.groupby(level='name')
print (resultAry.head())
resultAry = resultAry.plot()




plt.show()

谢谢大家。

Output Plot

图表没有排列,因为有多年的女孩名叫'约瑟夫',男孩名字'南希'。

============更新============== 2014/2/13

In [12]:

import pandas
import pylab
import matplotlib
from pandas import *
from pylab import *
from matplotlib import *

names = read_csv(r'C:\Users\joe\Documents\Python\baby-names2.csv')
print (names.head())

import matplotlib as mpl
import matplotlib.pyplot as plt

userNames = ['Joseph', 'Nancy']

resultAry = names[names.name.isin(userNames)].set_index(['year','name','sex'])['prop']
resultAry = resultAry.groupby(level='name')
print (resultAry.head())
print ('***************')
resultAry = resultAry.groupby(level='year')
print (resultAry)
#resultAry = resultAry.plot()

   year     name      prop  sex soundex
0  1880     John  0.081541  boy    J500
1  1880  William  0.080511  boy    W450
2  1880    James  0.050057  boy    J520
3  1880  Charles  0.045167  boy    C642
4  1880   George  0.043292  boy    G620
name    year  name    sex
Joseph  1880  Joseph  boy    0.022229
        1881  Joseph  boy    0.022679
        1882  Joseph  boy    0.021879
        1883  Joseph  boy    0.022367
        1884  Joseph  boy    0.022062
Nancy   1889  Nancy   boy    0.000059
        1933  Nancy   boy    0.000044
        1934  Nancy   boy    0.000044
        1935  Nancy   boy    0.000042
        1936  Nancy   boy    0.000059
dtype: float64
***************
name
Joseph    [(1880, [0.022229, 0.000102]), (1881, [0.02267...
Nancy     [(1880, [0.004211]), (1881, [0.004339]), (1882...
dtype: object

接下来我让他们添加两个值,但我仍然有格式化错误。     arr = list(resultAry ['Joseph'])

for i, (year, numbers) in enumerate(arr):
    arr[i][1][:] = [ sum(numbers) ]
print (arr)

[(1880, year  name    sex 
1880  Joseph  boy     0.022331
              girl    0.022331
Name: Joseph, dtype: float64), (1881, year...

非常感谢任何帮助建议。

1 个答案:

答案 0 :(得分:2)

我猜你正在使用Census婴儿名称数据集? Wes McKinney's book中使用的那个?将来,最好在数据集中包含一个样本,以便其他人可以重现您的工作。

我刚刚将2006 - 2010读入DataFrame,就像这样。

In [75]: df.head()
Out[75]: 
       name sex    num  year
0     Emily   F  21365  2006
1      Emma   F  19092  2006
2   Madison   F  18599  2006
3  Isabella   F  18200  2006
4       Ava   F  16925  2006

如上所述在prop中添加:

In [26]: df['prop'] = df.groupby('year')['num'].transform(lambda x: x / x.sum())


In [26]: df
Out[26]: 
         name sex    num  year      prop
0       Emily   F  21365  2006  0.005413
1        Emma   F  19092  2006  0.004837
2     Madison   F  18599  2006  0.004713
3    Isabella   F  18200  2006  0.004611
4         Ava   F  16925  2006  0.004288
5     Abigail   F  15615  2006  0.003956

我建议采用不同的方法来获取姓名和年份的计数。我认为这将使绘图更容易。而不是制作两个数据帧,每个名称一个,同时进行。

In [48]: df.query('name in ["Joeseph", "Nancy"]')
Out[48]: 
           name sex   num  year      prop
323       Nancy   F  1014  2006  0.000257
23206   Joeseph   M    34  2006  0.000009
34401     Nancy   F   896  2007  0.000225
57551   Joeseph   M    39  2007  0.000010
69300     Nancy   F   853  2008  0.000218
92066   Joeseph   M    45  2008  0.000011
104394    Nancy   F   663  2009  0.000174
127335  Joeseph   M    34  2009  0.000009
139050    Nancy   F   565  2010  0.000154
161863  Joeseph   M    29  2010  0.000008

[10 rows x 5 columns]

在pandas .13之前,您可以使用df[df.name.isin(['Joeseph', 'Nancy'])]

由于您已经计算了prop,因此我们不再需要groupby(这比我之前的要简单一点):

In [42]: s = df.query('name in ["Joeseph", "Nancy"]').set_index(['year', 'name'])['prop']

In [46]: ax = s.unstack().plot()

enter image description here

使用此方法,您不必担心对齐x值。它已经为你完成了。