2015-01-06 48 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

相關問題