1. 程式人生 > >利用python做資料分析(五)-讀取合併多個檔案

利用python做資料分析(五)-讀取合併多個檔案

pieces=[]
columns=['name','sex','births']
for year in range(1880,2011):
    path=('C:\\Users\\ecaoyng\\Desktop\\work space\\Python\\py_for_analysis\\pydata-book-master\\ch02\\names\\yob%d.txt' % year)
    frame=pd.read_csv(path,names=columns)
    frame['year']=year
    pieces.append(frame)

names=pd.concat(pieces,ignore_index=True)
names

names將所有的資料整合到單個DataFrame中
- concat預設將多個DataFrame整合到一起
- ignore_index=True, 因為我們不希望保留read_csv所返回的原始行號
可以得到結果集為:
這裡寫圖片描述
注意index的id,若不加ignore_index,則得到的結果集是
這裡寫圖片描述
看出區別了吧。

利用groupby和pivot_table在sex和year級別上對其進行聚合了

table_births=pd.pivot_table(names,index=['year'],columns='sex',values=['births'],aggfunc=sum
) table_births.tail()

這裡寫圖片描述

作圖

table_births.plot(title='Total births by sex and year')

這裡寫圖片描述

下面我們要統計百分比,再來看下原始的names:
這裡寫圖片描述
接著groupby year

names.groupby(['year']).births.sum()[:5]

year
1880 201486
1881 192703
1882 221538
1883 216954
1884 243466
Name: births, dtype: int64

現在想男女分開看:

names.groupby(['year'
,'sex']).births.sum()[:5]

year sex
1880 F 90993
M 110493
1881 F 91955
M 100748
1882 F 107851

下面來計算比例,並增加一列。astype的作用是型別轉換。

def add_prop(group):
    births=group.births.astype(float)
    group['prop']=births/births.sum()
    return group
names=names.groupby(['year','sex']).apply(add_prop)
names

這裡寫圖片描述

之後可以進行完整性認證,比如prop的和是否為1

np.allclose(names.groupby(['year','sex']).prop.sum(),1)

返回TRUE

現在我想取一個子集,比如year,sex groupby的頭1000個

def get_top1000(group):
    return group.sort_values(by='births',ascending=False)[:1000]
grouped=names.groupby(['year','sex'])
top1000=grouped.apply(get_top1000)
top1000

這裡寫圖片描述

男女的各自統計

boys=top1000[top1000.sex=='M']
girls=top1000[top1000.sex=='M']

製作透視表:

total_birth=pd.pivot_table(top1000,index=['year'],columns='name',values=['births'],aggfunc=sum)

這裡寫圖片描述

total_birth.births['John']

year
1880 9701.0
1881 8795.0
1882 9597.0
1883 8934.0
1884 9427.0
1885 8801.0
1886 9074.0
1887 8165.0
1888 9300.0

total_birth.births['John'].plot(title='John')

這裡寫圖片描述

現在檢視這最熱的1000個名字所佔全部名字的比例

table=pd.pivot_table(top1000,index=['year'],columns='sex',values=['prop'],aggfunc=sum)

這裡寫圖片描述

table.plot(title='Sum of table1000.prob by year and sex', yticks=np.linspace(0,1.2,13),xticks=range(1880,2020,10))

這裡寫圖片描述

df=boys[boys.year==2010]
prop_cumsum=df.sort_values(by='prop',ascending=False).prop.cumsum()

cumsum是計算累計和
261874 0.842953
261875 0.843055
261876 0.843156
Name: prop, dtype: float64

prop_cumsum.searchsorted(0.5)

array([116], dtype=int64),即最終結果是117

def get_quantile_count(group, q=0.5):
    group=group.sort_index(by='prop',ascending=False)
    return group.prop.cumsum().searchsorted(q)+1
diversity=top1000.groupby(['year','sex']).apply(get_quantile_count)
diversity

year sex
1880 F [38]
M [14]
1881 F [38]
M [14]
1882 F [38]
M [15]
1883 F [39]
M [15]

diversity.unstack('sex')

這裡寫圖片描述