如果列的所有元素都为负数,则对列进行切片

2024-04-20 13:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我是这样做的,但我觉得可以更简单一些。你知道吗

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]

Tags: columnsindataframedffordataifall
2条回答

希望这有助于:

>>> 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

进一步更新

如果我们比较400000行数据框的性能,我们会看到以下结果:

您的方法:

10 loops, best of 3: 42.2 ms per loop

@机翼法:

10 loops, best of 3: 124 ms per loop

使用np.all的numpy方法:

100 loops, best of 3: 9.47 ms per loop

因此,我们看到numpy方法在矢量化时伸缩性更好

相关问题 更多 >