目标:在同一图表上获取两个不同的名称。确保岁月排队。请注意,该文件不会有两年(当给女孩和男孩一个名字时),在这种情况下,为每个名字添加所有分年的值。
当前状态:一个名称正在运行。两个名称将索引更改为行号而不是年号。
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()
谢谢大家。
图表没有排列,因为有多年的女孩名叫'约瑟夫',男孩名字'南希'。
============更新============== 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...
非常感谢任何帮助建议。
答案 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()
使用此方法,您不必担心对齐x值。它已经为你完成了。