Pandas:多列

时间:2018-03-10 02:14:21

标签: python pandas

我有一个数据框如下。

In [23]: data2 = [{'a': 'x', 'b': 'y','c':'q'}, {'a': 'x', 'b': 'p', 'c': 'q'}, {'a':'p', 'b':'q'},{'a':'q', 'b':'y','c':'q'}]
In [26]: df = pd.DataFrame(data2)
In [27]: df
Out[27]: 
   a  b    c
0  x  y    q
1  x  p    q
2  p  q  NaN
3  q  y    q

我想做布尔索引来过滤掉具有x或y的列。我这样做

In [29]: df[df['a'].isin(['x','y']) | (df['b'].isin(['x','y']))]
Out[29]: 
   a  b  c
0  x  y  q
1  x  p  q
3  q  y  q

但我有超过50列,我需要检查并检查每列似乎不是非常pythonic。    我试过了

In [30]: df[df[['a','b']].isin(['x','y'])]

但输出不是我所期望的,我得到以下

Out[30]: 
     a    b    c
0    x    y  NaN
1    x  NaN  NaN
2  NaN  NaN  NaN
3  NaN    y  NaN

我可以删除所有NaN的行,但其余的值都缺失。

例如,在第0行中,-c是NaN,但我需要该值。

有任何建议怎么做?

2 个答案:

答案 0 :(得分:2)

您可以将df与'x'和'y'进行比较,然后执行逻辑或查找带有'x'或'y'的行。然后使用布尔数组作为索引来选择那些行。

df.loc[(df.eq('x') | df.eq('y')).any(1)]
Out[68]: 
   a  b  c
0  x  y  q
1  x  p  q
3  q  y  q

答案 1 :(得分:1)

这有效:

df.loc[df.apply(lambda x: 'x' in list(x) or 'y' in list(x), axis=1)]

   a  b  c
0  x  y  q
1  x  p  q
3  q  y  q
相关问题