2016-01-21 67 views
1

從熊貓數據幀列低計數我有以下熊貓數據幀:去除條件

new = pd.Series(np.array([0, 1, 0, 0, 2, 2])) 
df = pd.DataFrame(new, columns=['a']) 

I輸出的出現的每個值的條件:

print df['a'].value_counts() 

然後,我有以下內容:

0 3 
2 2 
1 1 
dtype: int64 

現在我想刪除列'a'值小於2的行。我可以遍歷每個值e在df ['a']中並且如果其值計數小於2則將其刪除,但是對於具有多個列的大數據幀來說花費很長時間。 我不明白什麼是有效的方法來做到這一點。

回答

0

一種方法是將計數數據與原始df相加。

df2 = pd.DataFrame(df['a'].value_counts()) 
df2.reset_index(inplace=True) 
df2.columns = ['a','counts'] 

# df2 = 
# a counts 
# 0 0 3 
# 1 2 2 
# 2 1 1 

df3 = df.merge(df2,on='a') 

# df3 = 
# a counts 
# 0 0 3 
# 1 0 3 
# 2 0 3 
# 3 1 1 
# 4 2 2 
# 5 2 2 

# filter 
df3[df3.counts>=2] 
1

你可以指定你子集的value_counts有那麼你的條件獲取Series那麼指數與isin你可以檢查它應該是在原始,然後將值傳遞給原來的數據框的值:

s = df['a'].value_counts() 
df[df.isin(s.index[s >= 2]).values] 

工作原理:

In [133]: s.index[s >= 2] 
Out[133]: Int64Index([0, 2], dtype='int64') 


In [134]: df.isin(s.index[s >= 2]).values 
Out[134]: 
array([[ True], 
     [False], 
     [ True], 
     [ True], 
     [ True], 
     [ True]], dtype=bool) 


In [135]: df[df.isin(s.index[s >= 2]).values] 
Out[135]: 
    a 
0 0 
2 0 
3 0 
4 2 
5 2