我需要在数据框中计算负值的总数。我能够获得一个数组,但无法找到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
答案 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()