2016-11-21 11 views
2

私は国勢調査データのパンダdataframeを持っています。列には、STNAME(州名)CTYNAME(郡名)と、年に国勢調査レポートで収集されたさまざまなデータの多くの列が含まれています。3列と基準によるパンダのデータフレームの検索

私はトップ3の最も人口の多い州を探していますが、州ごとに最も人口の多い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行以上あります(各郡ごとに1つずつ、複数の州があります)

私のアプローチは、STNAMEの各状態について、CENSUS2016POPの値(2010年の人口を表す整数)に基づいて、上位3郡をCTYNAMEに見つける関数を書くことです。次に、関数がこの基準によって上位3状態の文字列として名前を返すようにします。しかし、これを達成する方法はかなり失われています。

私はこれらの機能の組み合わせを使用しようとしているはずです。.groupby().set_index().nlargest()

ご協力いただければ幸いです!

+0

将来データのサンプルを投稿することができれば幸いです。 –

答えて

1

あなたは、任意のサンプルデータを提供しなかったので、ここではいくつかあります:

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) 
を:

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=',') 

ここで多分単純ありますが、私はさらにそれを減らすことができませんでした、望ましい結果を達成するための方法です分解する


# 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 [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 [4]: df2 = df.ix[df['STNAME'].isin(df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index)] 

は、その後最初の3中見つけるあなたはそれが国家の人口順にソートしたい場合は

を、次の順序で行ってください:

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

関連する問題