需要计算数据帧中的负值

时间:2016-03-22 13:39:02

标签: python pandas

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

sum(n<0 for n in numbers)

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

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

5 个答案:

答案 0 :(得分:12)

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

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

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

再次致电sum以对Series

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

Out[58]:
4

您还可以将布尔df转换为1-D数组并调用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方法在这里很容易胜出〜比循环方法快525倍,比纯大熊猫方法快4倍

答案 1 :(得分:2)

  

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

可以展平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

答案 2 :(得分:0)

我正在使用以下内容。可能不是最好的解决方法。

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

答案 3 :(得分:0)

EdChum的解决方案非常好,但是我想添加另一个使用pd.DataFrame.agg方法的简单且可接受的解决方案,该方法非常常用,因此应该很容易记住:

# Set up dataframe
import pandas as pd
df = pd.DataFrame({'a': [-3, -2, 4],
                   'b': [-2, 2, 5],
                   'c': [-1, 3, 7],
                   'd': [1, 4, 8]})

pd.DataFrame.agg方法将每一行或每一列(默认情况下为列)聚合到Series对象中。然后,您可以汇总级数以获得标量:

# Count all negative values in a dataframe.
df.agg(lambda x: sum(x < 0)).sum()

输出:

>>> 4

答案 4 :(得分:0)

count = (df < 0).sum().sum()