按Pandas中值的百分位数过滤列

时间:2017-07-29 11:36:43

标签: python pandas

我想用'很多'来过滤掉列。大熊猫中的零值。 过滤由“所有零值”组成的列并不困难,但我想要做的是过滤具有多个零值的列,例如,超过75%的列列值。

数据集(A有4个值的3个零,占列值的75%。)

A B C
0 0 0
0 0 1
0 1 2
1 2 3

结果

B C
0 0
0 1 
1 2
2 3

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您可以使用boolean mask True 1值转换为>=,然后将条件 - <转换为mean用于过滤0.75print ((df == 0).mean()) a 0.75 b 0.50 c 0.25 dtype: float64 print ((df == 0).mean() < 0.75) a False b True c True dtype: bool df = df.loc[:, (df == 0).mean() < 0.75] print (df) b c 0 0 1 1 0 1 2 1 0 3 1 1 的所有列:

#include <stdio.h>
#include <inttypes.h>
struct a
{
    long l[3];
};

struct a a1;
struct a a2;
struct a a3;
struct a a4[4];

int main(void)
{
    printf("sizeof(struct a) = %zu\n", sizeof(struct a));
    printf("a1 = 0x%.16" PRIXPTR "\n", (uintptr_t)(void *)&a1);
    printf("a2 = 0x%.16" PRIXPTR "\n", (uintptr_t)(void *)&a2);
    printf("a3 = 0x%.16" PRIXPTR "\n", (uintptr_t)(void *)&a3);
    for (int i = 0; i < 4; i++)
        printf("a4[%d] = 0x%.16" PRIXPTR "\n", i, (uintptr_t)(void *)&a4[i]);
    return 0;
}

答案 1 :(得分:1)

您可以使用列表理解,sum函数和drop

df = pd.DataFrame({'a':[0,0,0,1],'b':[0,0,1,1],'c':[1,1,0,1]})
mask = [i for i,j in enumerate((df == 0).astype(int).sum(axis=0).values)  if (j/df.shape[0])>=0.75]
df = df.drop(df.columns[mask], axis=1)

您可以根据需要设置百分位数。

输出:如果是75百分位,即(j/df.shape[0])>=0.75

 
   b  c
0  0  1
1  0  1
2  1  0
3  1  1

输出:如果是50百分位,即(j/df.shape[0])>=0.50

   c
0  1
1  1
2  0
3  1