【Python】Pandas——apply函式
阿新 • • 發佈:2019-01-23
apply
是 pandas
庫的一個很重要的函式,多和 groupby
函式一起用,也可以直接用於 DataFrame
和 Series
物件。主要用於資料聚合運算,可以很方便的對分組進行現有的運算和自定義的運算。
資料集
使用的資料集是美國人口普查的資料,可以從這裡下載,裡面包含了CSV資料檔案和PDF說明檔案,說明檔案裡解釋了每個變數的意義。
資料大致是這個樣子:
問題
- 以每個州人口最多的 3 個縣的人口總和為這個州人口的衡量標準,哪 3 個州人口最多?
- 在 2010 年至 2015 年間人口變化幅度最大的是哪個縣?
分析
- 先按州分組,再對每個州內的縣進行排序選出人口最多的 3 個縣求和,作為每個州的人口數,最後排序。
- 對於每個縣,計算 2010-2015 年的人口數的最大值和最小值,求出差值即變化幅度,再對差值進行排序找出變化幅度最大的縣。
程式碼
問題1
census_df = pd.read_csv('census.csv')
only_county = census_df[census_df['SUMLEV'] == 50]
deftop(df, n=3, column='CENSUS2010POP'):
return df.sort_values(column, ascending=False)[:n]['CENSUS2010POP'].sum()
grouped = only_county[['STNAME' , 'CTYNAME', 'CENSUS2010POP']].groupby('STNAME').apply(top)
grouped.sort_values(ascending=False)[:3].index.tolist()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
輸出:
問題2
census_df = pd.read_csv('census.csv')
only_county = census_df[census_df['SUMLEV'] == 50]
defget_change(row):
pop_year = row[['POPESTIMATE2010',
'POPESTIMATE2011' ,
'POPESTIMATE2012',
'POPESTIMATE2013',
'POPESTIMATE2014',
'POPESTIMATE2015']]
return pop_year.max() - pop_year.min()
only_county.loc[only_county.apply(get_change, axis=1).argmax()]['CTYNAME']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
輸出: