2017-01-02 93 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 

在上面的数据框中,我想删除占总面积的百分比< 10%的行。在这种情况下,这将是所有状态为爱荷华州的行。在熊猫中做什么是最好的方法?我尝试了groupby,但不知道如何继续。在大熊猫数据框中删除行数据占总数的百分比

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

回答

1

你想采取任何area值的每个state中,总结起来。我拿第一。

  • 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 
相关问题