2017-09-14 124 views
0

我想选择只有一个负值或没有值的列。我怎样才能构造这个看这个例子?我一直在寻找类似的东西,但没有成功。谢谢你的帮助。因此,在这个例子中选择只有一个负值的列

N = 5 
np.random.seed(0) 

df1 = pd.DataFrame(
      {'X':np.random.uniform(-3,3,N), 
      'Y':np.random.uniform(-3,3,N), 
      'Z':np.random.uniform(-3,3,N), 
       }) 

      X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784 

我想返回列X和Z

回答

2

您可以使用ILOC要做到这一点,即

df1.iloc[:,((df1<0).sum(0) <= 1).values] 

或(感谢乔恩)

df1.loc[:,df1.lt(0).sum() <= 1] 

输出:

 
      X   Z 
0 0.292881 1.750350 
1 1.291136 0.173370 
2 0.616580 0.408267 
3 0.269299 2.553580 
4 -0.458071 -2.573784 
+0

是的,我假设OP只需要col名称。 – Divakar

+1

或者使用'df1.loc [:,df1.lt(0).sum()<= 1]'而不是'iloc' –

+0

@JonClements是否不经过弃用?.loc?虽然熊猫人可以有更多的信息,但我只是在空中发现了很少的谣言。 – Divakar

4

使用np.sign得到迹象。寻找负面迹象。获取每列的负数。比较1的门槛来得到一个面具。从掩码中选择列名称。

因此,实施 -

df1.columns[(np.sign(df1)<0).sum(0)<=1].tolist() 

或者直接比较反对0更换使用np.sign -

df1.columns[(df1<0).sum(0)<=1].tolist() 

这给我们的列名。要选择整个列,我认为已经涵盖了其他解决方案。

+0

或者......也许......'df1.columns [df1.lt(0).sum()== 1]' –

+0

@JonClements Yup也可以用'sum(0)'和'<='修正。或者我们不需要'sum(0)'部分和'sum()'也足够了? – Divakar

+0

@JonClements Ah'sum'默认为'0',是吗?来自NumPy我假设总和(无),即总结给我们一个标量的所有元素。 – Divakar

0

或者你可以尝试:

df1.columns[(df1<0).sum(0).lt(1)] 
Out[338]: Index(['X', 'Z'], dtype='object') 
+1

OP表示栏目。不是行。 – Dark

+0

@Bharathshetty LOL更新 – Wen