2016-11-21 41 views
2

我有一個來自美國的人口普查數據的熊貓dataframe。專欄包括STNAME(州名)CTYNAME(縣名)以及各年份在人口普查報告中收集的各種不同數據欄。熊貓數據框由3列和標準搜索

我在尋找前三名人口最多的州,只包括每個州中前三名人口最多的州。

這是我的當前代碼,扶正原始數據幀一個比特,並只包括什麼是相關的問題:

def answer(): 
    census_df50 = census_df[census_df['SUMLEV'] == 50] 
    columns = ['STNAME', 'CTYNAME', 'CENSUS2010POP'] 
    c = census_df50[columns] 
    return c 
print(answer()) 

,這裏是在該終端打印的數據幀的一個示例:

 STNAME    CTYNAME CENSUS2010POP 
1  Alabama  Autauga County   54571 
2  Alabama  Baldwin County   182265 
3  Alabama  Barbour County   27457 
4  Alabama   Bibb County   22915 
5  Alabama  Blount County   57322 
6  Alabama  Bullock County   10914 
7  Alabama  Butler County   20947 
8  Alabama  Calhoun County   118572 

它由州和縣按字母順序列出,所以這裏只顯示縣名的阿拉巴馬人口普查數據,但數據框中有3000多行(每縣一個,州有多個條目)

我的方法是根據CENSUS2016POP值(表示2010年人口的整數)編寫一個函數,找到CTYNAME中的前3個縣,併爲STNAME列中的每個州查找。然後讓該函數按照這個標準返回前3個狀態的字符串。然而,如何實現這一點卻相當迷茫。

我敢肯定,我應該嘗試使用這些功能.groupby().set_index().nlargest()的組合。

任何幫助將不勝感激!

+0

如果您將來可以發佈您的數據樣本,那將會很棒。 –

回答

1

既然你沒有提供任何樣本數據,這裏的一些:

STNAME,CTYNAME,POPULATION 
A,A1,100 
A,A2,20 
A,A3,30 
A,A4,40 
B,B1,10 
B,B2,2 
B,B3,30 
B,B4,40 
C,C1,100 
C,C2,20 
C,C3,300 
C,C4,40 
D,D1,10 
D,D2,20 
D,D3,30 
D,D4,40 

In [1]: df = pd.read_clipboard(sep=',') 

這裏有一個方法來達到預期的效果,也許有更簡單的,但我不能進一步降低它:

In [2]: df.ix[df['STNAME'].isin(df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index)].groupby(['STNAME','CTYNAME']).sum()['POPULATION'].groupby(level=0, group_keys=False).nlargest(3) 

分解:

# Find the first STNAME Groups 
In [3]: largest_states = df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index 
     largest_states 

Out[3]: Index(['C', 'A', 'D'], dtype='object', name='STNAME') 

過濾這些的DF:

In [4]: df2 = df.ix[df['STNAME'].isin(df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index)] 

然後找內的三個第一:

In [5]: df2.groupby(['STNAME','CTYNAME']).sum()['POPULATION'].groupby(level=0, group_keys=False).nlargest(3) 

Out[5]: 
STNAME CTYNAME 
A  A1   100 
     A4   40 
     A3   30 
C  C3   300 
     C1   100 
     C4   40 
D  D4   40 
     D3   30 
     D2   20 
Name: POPULATION, dtype: int64 

更新:

如果你想讓它由國家人口進行排序,按照以下順序執行:

In[6]: df2 = df.groupby(['STNAME','CTYNAME']).sum()['POPULATION'].groupby(level=0, group_keys=False).nlargest(3) 

     df2.ix[df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index] 

Out[6]: 
STNAME CTYNAME 
C  C3   300 
     C1   100 
     C4   40 
A  A1   100 
     A4   40 
     A3   30 
D  D4   40 
     D3   30 
     D2   20 
Name: POPULATION, dtype: int64 
+0

謝謝你的迴應!現在看看它。感謝您的建議。我剛剛編輯了我的問題,以添加一些我的原始代碼和數據框的輸出示例。 – Ken