需要计算数据框中的负值

新手上路,请多包涵

我需要数据框中负值的总数。我能够获取数组但无法找到 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

原文由 Sanchit Aluna 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 474
2 个回答

我能够获取数组但无法找到 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

原文由 bakkal 发布,翻译遵循 CC BY-SA 3.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 方法在这里轻松胜出,比循环方法快 525 倍,比纯 pandas 方法快 4 倍

原文由 EdChum 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题