pandas 如果列的所有元素都是负数,则对列进行切片
pandas slicing columns if all elements of the column are negative
我是这样做的,但我觉得它可以更简单。
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]
希望这会有所帮助:
>>> 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
使用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
更新
@Aerofoil 的答案实际上是这里最慢的,它的缩放比例可能比你的好,但我怀疑它会比 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
@Aerofoil的方法:
10 loops, best of 3: 124 ms per loop
numpy 方法使用 np.all
:
100 loops, best of 3: 9.47 ms per loop
所以我们看到 numpy 方法在矢量化时扩展得更好
我是这样做的,但我觉得它可以更简单。
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]
希望这会有所帮助:
>>> 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
使用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
更新
@Aerofoil 的答案实际上是这里最慢的,它的缩放比例可能比你的好,但我怀疑它会比 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
@Aerofoil的方法:
10 loops, best of 3: 124 ms per loop
numpy 方法使用 np.all
:
100 loops, best of 3: 9.47 ms per loop
所以我们看到 numpy 方法在矢量化时扩展得更好