2017-01-02 10 views
2
country state  year area 
usa  iowa  2000 30 
usa  iowa  2001 30 
usa  iowa  2002 30 
usa  iowa  2003 30 
usa  kansas  2000 500 
usa  kansas  2001 500 
usa  kansas  2002 500 
usa  kansas  2003 500 
usa washington 2000 245 
usa washington 2001 245 
usa washington 2002 245 
usa washington 2003 245 

上記のデータフレームでは、%of total area <%の行を削除したいと考えています。この場合、それはiowaとして状態を持つすべての行になります。パンダでそれをする最善の方法は何ですか?私はgroupbyを試みたが、進める方法がわからない。合計の部分に基づいてパンダのデータフレームの行を削除する

df.groupby('area').sum() 

答えて

1

あなたは、各stateareaのいずれかの値を指定し、それらを合計します。私は最初を取る。

  • groupby('state').area.first().sum()は正規化するものです。

df[df.area.div(df.groupby('state').area.first().sum()) >= .1] 

    country  state year area 
4  usa  kansas 2000 500 
5  usa  kansas 2001 500 
6  usa  kansas 2002 500 
7  usa  kansas 2003 500 
8  usa washington 2000 245 
9  usa washington 2001 245 
10  usa washington 2002 245 
11  usa washington 2003 245 
+0

おかげで、この場合は右側の領域である@piRSquaredを30 + 500 + 245列全体を追加することになりますあなたのソリューション右? – user308827

2

drop_duplicatesとダブルboolean indexingのもう一つの解決策:

a = df.drop_duplicates(['state','area']) 
print (a) 
    country  state year area 
0  usa  iowa 2000 30 
4  usa  kansas 2000 500 
8  usa washington 2000 245 

states = a.loc[a.area.div(a.area.sum()) >.1, 'state'] 
print (states) 
4  kansas 
8 washington 
Name: state, dtype: object 

print (df[df.state.isin(states)]) 
    country  state year area 
4  usa  kansas 2000 500 
5  usa  kansas 2001 500 
6  usa  kansas 2002 500 
7  usa  kansas 2003 500 
8  usa washington 2000 245 
9  usa washington 2001 245 
10  usa washington 2002 245 
11  usa washington 2003 245 
関連する問題