我想用'很多'来过滤掉列。大熊猫中的零值。 过滤由“所有零值”组成的列并不困难,但我想要做的是过滤具有多个零值的列,例如,超过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
有什么建议吗?
答案 0 :(得分:3)
您可以使用boolean mask
True
1
值转换为>=
,然后将条件 - <
转换为mean
用于过滤0.75
为print ((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