[問題] [Pandas] 轉成pivot後選出最大最小值
大家好~ 我又來請教pandas的相關問題,題目一樣來自coursera introduction to Data Science in Python的第二週作業
題目:哪個county在 2010-2015 期間人口改變數量的絕對值最高?
我的想法:
1)將state從county list中去除
2)製作一個pivot table,以county為欄,並以2010-2015的人數為值
3)對每欄(每個county) filter 出最大值及最小值,並相減
4)回傳差異最大的城市
以下是我的code:
census_df = pd.read_csv('https://storage.googleapis.com/py_ml_datasets/census.csv')
def answer_three():
city_name = census_df["CTYNAME"].unique()
state_name = census_df["STNAME"].unique()
rest = list(set(city_name)^set(state_name))
city_filter = census_df[census_df["SUMLEV"]==50]
city_pivot = city_filter.pivot_table(columns = ["CTYNAME"], values = ["POPESTIMATE2010","POPESTIMATE2011","POPESTIMATE2012", "POPESTIMATE2013", "POPESTIMATE2014", "POPESTIMATE2015"] )
find_diff = city_pivot[rest].max() - city_pivot[rest].min()
return find_diff.idxmax()
answer_three()
得出的答案是錯的(Los Angeles County,其為差異第二大的county)
答案是Haris County
我的問題是:
針對DataFrame做pivot table後,對每個欄位(county)filter 出最大最小值時,
有極少部分的county的最大最小值會被“未知的數字給覆蓋掉”
pivot table的type仍為DataFrame,但到filter最大最小值時type已轉變為Series
(我猜只是二維變一維的關係)
想請教:
對pivot table做filter最大最小值時,如何避免數字跑掉的問題?
(我確定pivot table抓的數字是對的,但到filter階段會有極少部分的數字是錯的)
感謝大家耐心地看完 :)
------------------我是分隔線-----------------------
感謝i大的分享,突破了我的盲點
我原本的方法有一個瑕疵:人口數可能來自於多個county,因為同一個名字的county可能存在於多個state裡
於是我換了一個方法,得到的答案是正確的(程式也變得比較簡潔)
1)製作一個pivot table,以state及county為index,以2010~2015的人口數及SUMLEV為值
2)利用SUMLEV filter出county (原本的list包含state)
3)對pivot table新增三欄:2010~2015的最多及最少人口數, 與最多與最少人口數的差異
4)使用idxmax()找出差異最大值的對應county
以下是code:
def answer_three():
city_table = census_df.pivot_table(values = ["SUMLEV","POPESTIMATE2010","POPESTIMATE2011","POPESTIMATE2012", "POPESTIMATE2013", "POPESTIMATE2014", "POPESTIMATE2015"], index = ["STNAME", "CTYNAME"])
city_filter = city_table[city_table["SUMLEV"] == 50]
add_max = city_filter[["POPESTIMATE2010", "POPESTIMATE2011", "POPESTIMATE2012", "POPESTIMATE2013", "POPESTIMATE2014", "POPESTIMATE2015"]].max(axis = 1)
add_min = city_filter[["POPESTIMATE2010", "POPESTIMATE2011", "POPESTIMATE2012", "POPESTIMATE2013", "POPESTIMATE2014", "POPESTIMATE2015"]].min(axis = 1)
add_diff = add_max - add_min
find_max_diff = add_diff.idxmax()
return find_max_diff
answer_three()
然而,type從DataFrame到Series,有極少部分資料會被未知的值給覆蓋掉
這點我還是沒有找到原因
(我的第一解:從pivot table對每欄filter出最大及最小值時)
找到原因再跟大家分享~~
再次感謝i大詳細的說明 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.243.75
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1529312610.A.599.html
※ 編輯: e9904567 (223.140.243.75), 06/18/2018 17:03:57
推
06/19 07:41,
7年前
, 1F
06/19 07:41, 1F
→
06/19 07:42,
7年前
, 2F
06/19 07:42, 2F
→
06/19 07:42,
7年前
, 3F
06/19 07:42, 3F
→
06/19 07:42,
7年前
, 4F
06/19 07:42, 4F
→
06/19 07:44,
7年前
, 5F
06/19 07:44, 5F
→
06/19 07:44,
7年前
, 6F
06/19 07:44, 6F
→
06/19 07:44,
7年前
, 7F
06/19 07:44, 7F
→
06/19 07:47,
7年前
, 8F
06/19 07:47, 8F
→
06/19 07:47,
7年前
, 9F
06/19 07:47, 9F
→
06/19 07:47,
7年前
, 10F
06/19 07:47, 10F
→
06/19 07:47,
7年前
, 11F
06/19 07:47, 11F
※ 編輯: e9904567 (223.136.218.65), 06/19/2018 20:28:00
感謝i大!!您的推文突破我的盲點,我把新寫好的code更新在內文裡
最後有找到答案~~~
※ 編輯: e9904567 (223.136.218.65), 06/19/2018 20:29:53
推
06/20 18:30,
7年前
, 12F
06/20 18:30, 12F
→
06/20 18:30,
7年前
, 13F
06/20 18:30, 13F
Python 近期熱門文章
PTT數位生活區 即時熱門文章