需要计算数据帧中的负值

San*_*una 7 python pandas

我需要在数据帧中计算负值的总数.我能够获得一个数组,但无法找到DataFrame.我使用下面的代码可以任何人建议我如何得到以下DataFrame的计数.

sum(n<0 for n in numbers)
Run Code Online (Sandbox Code Playgroud)

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

  a  b  c  d
   -3 -2 -1  1
   -2  2  3  4
    4  5  7  8
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 13

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

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

Out[66]:
a    2
b    1
c    1
d    0
dtype: int64
Run Code Online (Sandbox Code Playgroud)

sum再次打电话给Series:

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

Out[58]:
4
Run Code Online (Sandbox Code Playgroud)

您还可以将布尔df转换为1-D数组并调用np.sum:

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

Out[62]:
4
Run Code Online (Sandbox Code Playgroud)

计时

对于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
Run Code Online (Sandbox Code Playgroud)

np方法在这里很容易胜过〜循环方法快〜525倍,比纯大熊猫方法快4倍


bak*_*kal 6

我能够获取一个数组但无法找到 DataFrame

可以将 DataFrame 展平以使用对一维数组进行操作的函数。因此,如果您对此感到满意(可能比 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
Run Code Online (Sandbox Code Playgroud)