需要数据帧中的负值计数

2024-03-29 11:48:20 发布

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

我需要一个数据帧中负值的总数。我可以获取数组,但找不到数据帧。对于我正在使用的数组下面的代码可以有任何人建议我如何获得下面的数据帧计数。

sum(n<0 for n in numbers)

下面是我的数据帧,预期结果是4

  a  b  c  d
   -3 -2 -1  1
   -2  2  3  4
    4  5  7  8

Tags: 数据代码infor数组建议计数sum
3条回答

I am able to get for an array but unable to find for DataFrame

可以展平数据帧以使用在1D数组上操作的函数。所以如果你同意的话(可能比EdChum的回答慢):

>>> import pandas as pd
>>> df = pd.DataFrame({'a': [-3, -2, 4], 'b': [-2, 2, 5], 'c': [-1, 3, 7], 'd': [1, 4, 8]})
>>> df.values
array([[-3, -2, -1,  1],
       [-2,  2,  3,  4],
       [ 4,  5,  7,  8]])
>>> df.values.flatten()
array([-3, -2, -1,  1, -2,  2,  3,  4,  4,  5,  7,  8])
>>> sum(n < 0 for n in df.values.flatten())
4

我在用下面的。可能不是最好的办法。

negatives = len(df.loc[(df.a < 0)]) + len(df.loc[(df.b < 0)] + 
            len(df.loc[(df.c < 0)] + len(df.loc[(df.d < 0)]

可以调用.lt将df与标量值进行比较,然后调用sum两次(这是因为它首先对行进行求和)

In [66]:
df.lt(0).sum()

Out[66]:
a    2
b    1
c    1
d    0
dtype: int64

再次调用sumSeries进行求和:

In [58]:
df.lt(0).sum().sum()

Out[58]:
4

还可以将布尔df转换为一维数组并调用np.sum

In [62]:
np.sum((df < 0).values.ravel())

Out[62]:
4

计时

对于30K行df:

In [70]:
%timeit sum(n < 0 for n in df.values.flatten())
%timeit df.lt(0).sum().sum()
%timeit np.sum((df < 0).values.ravel())

1 loops, best of 3: 405 ms per loop
100 loops, best of 3: 2.36 ms per loop
1000 loops, best of 3: 770 µs per loop

np方法比loop方法快约525倍,比纯pandas方法快约4倍

相关问题 更多 >