2016-07-07 47 views
2

考虑下面的代码:与大熊猫极为不平等分配的值删除列数据框

import numpy as np 
import pandas as pd 

arr = np.array([ 
    [1,2,9,1,1,1], 
    [2,3,3,1,0,1], 
    [1,4,2,1,2,1], 
    [2,3,1,1,2,1], 
    [1,2,3,1,8,1], 
    [2,2,5,1,1,1], 
    [1,3,8,7,4,1], 
    [2,4,7,8,3,3] 
    ]) 
# 1,2,3,4,5,6 <- Number of the columns. 
df = pd.DataFrame(arr) 

for _ in df.columns.values: 
    print {x: list(df[_]).count(x) for x in set(df[_])} 

我想从数据框中删除所有在比列的所有其他值,就会发生一个值往往列一起。在这种情况下,我想删除第4列和第6列(请参阅评论),因为第1列出现的频率高于这些列中的所有其他数字(第4列中的6> 2和第6列中的7> 1)。我不想放弃第一列(4 = 4)。我会怎么做?

回答

5

另一种选择是做每一列上,并且如果最大计数的是小于或等于该数据帧的行数的一半的值的计数,然后选择它:

df.loc[:, df.apply(lambda col: max(col.value_counts()) <= df.shape[0]/2)] 

# 0 1 2 4 
#0 1 2 9 1 
#1 2 3 3 0 
#2 1 4 2 2 
#3 2 3 1 2 
#4 1 2 3 8 
#5 2 2 5 1 
#6 1 3 8 4 
#7 2 4 7 3 
+0

这看起来非常好,简洁,但为什么你将df.shape [0]除以2?我不明白这一步... – Ohumeronen

+0

我的假设是,OP的兴趣在于整个df是否频繁出现一个值,而不是列明智 – EdChum

+1

根据逻辑,*一个值比所有其他值的列一起*这意味着最频繁出现的值应该比所有其他值计数组合的计数少,因此不到总计数的一半。 – Psidom