我需要在数据帧中计算负值的总数.我能够获得一个数组,但无法找到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倍
我能够获取一个数组但无法找到 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)