2015-01-06 30 views
1

我是这样做的,但我觉得它可能会更简单。如果列中的所有元素都是负值,熊猫会将列切片

df = pd.DataFrame(data={'A':[1,1,1,1], 'B':[-1,-1,-1,-1], 'C':[-1,-1,-1,-1], 'D':[-1,-1,-1,-1], 'E':[1,1,1,1]}) 
print df 

msk= [] 
for i,k in enumerate(df.columns.tolist()): 
    if (df.iloc[:,i]<0).all(0): 
     msk.append(k) 

df[msk] 
print df[msk] 
+0

提供一些I/O示例 – aerokite

回答

2

使用np.all,并通过axis=0

In [14]: 

df[df.columns[np.all(df<0, axis=0)]] 
Out[14]: 
    B C D 
0 -1 -1 -1 
1 -1 -1 -1 
2 -1 -1 -1 
3 -1 -1 -1 

时序

In [18]: 

%%timeit 
msk= [] 
for i,k in enumerate(df.columns.tolist()): 
    if (df.iloc[:,i]<0).all(0): 
     msk.append(k) 

df[msk] 
1000 loops, best of 3: 1.78 ms per loop 
In [19]: 

%timeit df[df.columns[np.all(df < 0, axis=0)]] 

1000 loops, best of 3: 661 µs per loop 

更新

@翼型的答案其实最慢的在这里,它可能鳞比你的更好,但我怀疑它会比numpy的方法

In [25]: 

%timeit df[(df<0)].dropna(axis=1) 
100 loops, best of 3: 2.11 ms per loop 

进一步更新

快如果我们比较400,000行df的性能,那么我们看到以下内容:

您的方法:

10 loops, best of 3: 42.2 ms per loop 

@翼型的方法:

10 loops, best of 3: 124 ms per loop 

numpy的方法使用np.all

100 loops, best of 3: 9.47 ms per loop 

所以我们看到numpy的方法扩展,因为它是矢量化好得多

+0

In [189]:%timeit df [(df <0)]。dropna(axis = 1) 100个循环,最好是3:每个循环6.09 ms In [190]:%timeit df [df.columns [np .all(df <0,axis = 0)]] 100个循环,最好的3:每个循环3.25 ms – euri10

+0

感谢您展示这个解决方案,这真是太快了 – euri10

+0

如果可能的话,字? – euri10

1

希望这将帮助:

>>> from pandas import * 
>>> import pandas as pd 

>>> L = [[1,2,-1], [-5,6,-3], [-1,-2,-7]] 

>>> df = DataFrame(L) 
>>> df 
    0 1 2 
0 1 2 -1 
1 -5 6 -3 
2 -1 -2 -7 

>>> df1 = df[(df<0)].dropna(axis=1) 
>>> df1 
    2 
0 -1 
1 -3 
2 -7 
+0

谢谢,下拉是我失踪的! – euri10

相关问题