根据外观过滤pandas交叉表

时间:2018-03-15 12:50:43

标签: python pandas

我有大熊猫交叉表,我想过滤一次出现的项目,以便更容易解释,我会制作人工数据,这里是我的数据

Customer_id        Apple     Book    Candy
1                  0         1       1
2                  1         1       0
3                  1         1       0
4                  1         0       0

因为Candy刚出现一次,所以结果就像

Customer_id        Apple     Book 
1                  0         1      
2                  1         1       
3                  1         1       
4                  1         0       

2 个答案:

答案 0 :(得分:3)

boolean indexing与布尔掩码一起使用:

如果希望过滤掉每列只有一个1而不首先:

df = df.set_index('Customer_id')
df = df.loc[:, df.eq(1).sum().ne(1)]
print (df)
             Apple  Book
Customer_id             
1                0     1
2                1     1
3                1     1
4                1     0

<强>详情:

1比较:

print (df.eq(1))
             Apple   Book  Candy
Customer_id                     
1            False   True   True
2             True   True  False
3             True   True  False
4             True  False  False

True

计算每列的sum秒数
print (df.eq(1).sum())
Apple    3
Book     3
Candy    1

1比较不等于:

print (df.eq(1).sum().ne(1))
Apple     True
Book      True
Candy    False
dtype: bool

如果希望每列只过滤一个0而不首先:

df = df.set_index('Customer_id')
df = df.loc[:, df.eq(0).sum().eq(1)]
print (df)
             Apple  Book
Customer_id             
1                0     1
2                1     1
3                1     1
4                1     0

<强>详情:

0比较:

print (df.eq(0))
             Apple   Book  Candy
Customer_id                     
1             True  False  False
2            False  False   True
3            False  False   True
4            False   True   True

True

计算每列的sum秒数
print (df.eq(0).sum())
Apple    1
Book     1
Candy    3
dtype: int64

1比较:

print (df.eq(0).sum().eq(1))
Apple     True
Book      True
Candy    False
dtype: bool

答案 1 :(得分:3)

使用dropna

df.replace(0,np.nan).dropna(axis=1,thresh=2).fillna(0).astype(int)
Out[18]: 
   Customer_id  Apple  Book
0            1      0     1
1            2      1     1
2            3      1     1
3            4      1     0