2017-04-01 79 views
0

我試圖找到這三個人口最多的城市部件(BYDEL)於1992年Python的分析csv文件

我有一個CSV文件看起來像這樣:http://data.kk.dk/dataset/9070067f-ab57-41cd-913e-bc37bfaf9acd/resource/9fbab4aa-1ee0-4d25-b2b4-b7b63537d2ec/download/befkbhalderkoencivst.csv>

CSV文件可以作爲解釋:

AAR:在觀測在哪一年

BYDEL:哪個城市的一部分,由一個整數描述我所含n遵循字典; 1 = Indre By,2 =Østerbro,3 =Nørrebro,4 = Vesterbro/Kgs。 Enghave,5 = Valby,6 =Vanløse,7 =Brønshøj-蘇姆,8 = Bispebjerg,9 =阿邁厄OST,10 =阿邁厄背心,99 = Udenfor inddeling

ALDER:所觀察到的人的年齡

PERSONER:與該行

我有一個解決方案,但它是非常重複,我認爲它可以做更聰明,但我沒有與蟒蛇足夠的經驗給定功能的意見數量。任何人都可以將我指向正確的方向嗎?

我的代碼/解決方案是這樣的:

df = pd.read_csv('befkbh.csv',quotechar='"',skipinitialspace=True, delimiter=',', encoding='latin1').fillna(0) 
data = df.as_matrix() 
Q31 = collections.defaultdict(list) 
Q32 = collections.defaultdict(list) 
Q33 = collections.defaultdict(list) 
Q34 = collections.defaultdict(list) 
Q35 = collections.defaultdict(list) 
Q36 = collections.defaultdict(list) 
Q37 = collections.defaultdict(list) 
Q38 = collections.defaultdict(list) 
Q39 = collections.defaultdict(list) 
Q310 = collections.defaultdict(list) 
Q399 = collections.defaultdict(list) 
for row in data: 
    key = row[0] 
    if key == "" or key == 0: continue 
    if key == 1992: 
     if row[2] == 1: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q31.setdefault(key,[]).append(val) 
     if row[2] == 2: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q32.setdefault(key,[]).append(val) 
     if row[2] == 3: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q33.setdefault(key,[]).append(val) 
     if row[2] == 4: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q34.setdefault(key,[]).append(val) 
     if row[2] == 5: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q35.setdefault(key,[]).append(val) 
     if row[2] == 6: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q36.setdefault(key,[]).append(val) 
     if row[2] == 7: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q37.setdefault(key,[]).append(val) 
     if row[2] == 8: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q38.setdefault(key,[]).append(val) 
     if row[2] == 9: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q39.setdefault(key,[]).append(val) 
     if row[2] == 10: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q310.setdefault(key,[]).append(val) 
     if row[2] == 99: 
      val = 0 if(row[5]) =="" else float(row[5]) 
      Q399.setdefault(key,[]).append(val) 

Q312 = {} 
for k, v in Q31.items(): Q312[k] = sum(v) 
for k, v in Q312.items(): print ("{}:{}".format(k,v)) 
Q322 = {} 
for k, v in Q32.items(): Q322[k] = sum(v) 
for k, v in Q322.items(): print ("{}:{}".format(k,v)) 
Q332 = {} 
for k, v in Q33.items(): Q332[k] = sum(v) 
for k, v in Q332.items(): print ("{}:{}".format(k,v)) 
Q342 = {} 
for k, v in Q34.items(): Q342[k] = sum(v) 
for k, v in Q342.items(): print ("{}:{}".format(k,v)) 
Q352 = {} 
for k, v in Q35.items(): Q352[k] = sum(v) 
for k, v in Q352.items(): print ("{}:{}".format(k,v)) 
Q362 = {} 
for k, v in Q36.items(): Q362[k] = sum(v) 
for k, v in Q362.items(): print ("{}:{}".format(k,v)) 
Q372 = {} 
for k, v in Q37.items(): Q372[k] = sum(v) 
for k, v in Q372.items(): print ("{}:{}".format(k,v)) 
Q382 = {} 
for k, v in Q38.items(): Q382[k] = sum(v) 
for k, v in Q382.items(): print ("{}:{}".format(k,v)) 
Q392 = {} 
for k, v in Q39.items(): Q392[k] = sum(v) 
for k, v in Q392.items(): print ("{}:{}".format(k,v)) 
Q3102 = {} 
for k, v in Q310.items(): Q3102[k] = sum(v) 
for k, v in Q3102.items(): print ("{}:{}".format(k,v)) 
Q3992 = {} 
for k, v in Q399.items(): Q3992[k] = sum(v) 
for k, v in Q3992.items(): print ("{}:{}".format(k,v)) 

回答

5

它實際上是你已經認識到,必須有一個更簡單的方法一個非常好的跡象!每當你發現自己違反DRY原則(不要重複自己),你應該問你是否有失誤。

雖然你可以簡單地使用,而不是所有的命名變量的字典詞典中刪除了大量的重複勞動,因爲你使用的熊貓,我會採取的groupbynlargest代替的優勢,這給了我:

In [47]: dg = df.groupby(["AAR", "BYDEL"], as_index=False)["PERSONER"].sum() 

In [48]: dg[dg.AAR == 1992].nlargest(3, "PERSONER") 
Out[48]: 
    AAR BYDEL PERSONER 
2 1992  3  67251 
1 1992  2  62221 
3 1992  4  47854 

首先,我們組的AAR和BYDEL列,並且每一組中,我們採取PERSONER值,總結他們。這給了我們這開始

n [51]: dg.head(15) 
Out[51]: 
    AAR BYDEL PERSONER 
0 1992  1  40595 
1 1992  2  62221 
2 1992  3  67251 
3 1992  4  47854 
4 1992  5  43688 
5 1992  6  34303 
6 1992  7  36746 
7 1992  8  41668 
8 1992  9  45305 
9 1992  10  42748 
10 1992  99  2187 
11 1993  1  40925 
12 1993  2  62583 
13 1993  3  67783 
14 1993  4  47589 

那麼我們選擇行的框架,其中AAR == 1992年,並與3個大PERSONER值的行。

我倒是強烈建議讀通過pandas tutorial如果你打算做這種類型的數據處理,否則你會發現自己重新發明輪子。

+0

究竟那種單挑我一直在尋找。謝謝大家,熊貓將在未來爲我節省大量的時間和精力:) – Rainoa

+0

完美的答案,很好 – single430

+0

我試圖讓所有不同的年份和pd.unique()的前3名只給我所有不同年份的數組。什麼是最聰明的熊貓方式呢?先謝謝了! – Rainoa

1

更多pythonic解決方案將使用字典,而不是許多(大部分)您的命名變量。您也正在使用setdefaultdefaultdict實例 - 任何一個都是不錯的選擇,但使用兩者都是不必要的。

我的另一個版本(不使用熊貓,因爲@DSM蓋那麼好):

df = pd.read_csv('befkbh.csv',quotechar='"',skipinitialspace=True, delimiter=',', encoding='latin1').fillna(0) 
data = df.as_matrix() 
areas = { k : collections.defaultdict(list) for k in range(1,11) } 
areas[99] = collections.defaultdict(list) 

for row in data: 
    key = row[0] 
    if key == 1992 and row[1] in areas: 
     areas[row[1]][key].append(0 if(row[5]) =="" else float(row[5])) 

for area in sorted(areas): 
    for k, v in areas[area].items(): 
     print ("{}:{}".format(k, sum(v))) 

我假設row[2]的問題應該已經row[1],因爲BYDEL是第二列,而不是第三。

爲了逐年獲得排名前三的地區,我會組織一些不同的事情,外部詞典是一年,而不是地區。

該版本是這樣的:

years = collections.defaultdict(lambda : collections.defaultdict(list)) 

for row in data: 
    years[row[0]][row[1]].append(0 if(row[5]) =="" else float(row[5])) 

for year in sorted(years): 
    for n, area in sorted((sum(v), k) for k, v in years[year].items())[:-4:-1]: 
     print ("{} {:4} {:9}".format(year, area, n)) 
+0

完成。感謝推動。 – cco