统计每列中小于x的元素个数

51 投票
2 回答
104001 浏览
提问于 2025-04-18 07:25

我有一个数据表,长得像下面这样。我想统计每一列中小于2.0的元素数量,然后把结果用条形图展示出来。我之前是用列表和循环来做的,但我在想有没有更快的“Pandas方式”来完成这个任务。

x = []
for i in range(6):
    x.append(df[df.ix[:,i]<2.0].count()[i])

然后我可以用列表 x 来生成条形图。

          A          B          C          D          E          F 
0       2.142      1.929      1.674      1.547      3.395      2.382
1       2.077      1.871      1.614      1.491      3.110      2.288
2       2.098      1.889      1.610      1.487      3.020      2.262
3       1.990      1.760      1.479      1.366      2.496      2.128
4       1.935      1.765      1.656      1.530      2.786      2.433

2 个回答

1

方法链是可以实现的(比较运算符有各自的方法,比如 < 对应 lt()<= 对应 le()):

df.lt(2).sum()

如果你需要考虑多个条件,比如统计在2到10之间的值的数量。你可以在两个布尔系列上使用布尔运算符:

(df.gt(2) & df.lt(10)).sum()

或者你可以使用 pd.eval()

pd.eval("2 < df < 10").sum()

统计小于2或大于10的值的数量:

(df.lt(2) | df.gt(10)).sum()
# or
pd.eval("df < 2 or df > 10").sum()
70
In [96]:

df = pd.DataFrame({'a':randn(10), 'b':randn(10), 'c':randn(10)})
df
Out[96]:
          a         b         c
0 -0.849903  0.944912  1.285790
1 -1.038706  1.445381  0.251002
2  0.683135 -0.539052 -0.622439
3 -1.224699 -0.358541  1.361618
4 -0.087021  0.041524  0.151286
5 -0.114031 -0.201018 -0.030050
6  0.001891  1.601687 -0.040442
7  0.024954 -1.839793  0.917328
8 -1.480281  0.079342 -0.405370
9  0.167295 -1.723555 -0.033937

[10 rows x 3 columns]
In [97]:

df[df > 1.0].count()

Out[97]:
a    0
b    2
c    2
dtype: int64

所以在你的情况下:

df[df < 2.0 ].count() 

应该可以正常工作

编辑

一些时间记录

In [3]:

%timeit df[df < 1.0 ].count() 
%timeit (df < 1.0).sum()
%timeit (df < 1.0).apply(np.count_nonzero)
1000 loops, best of 3: 1.47 ms per loop
1000 loops, best of 3: 560 us per loop
1000 loops, best of 3: 529 us per loop

所以@DSM的建议是正确的,而且比我的建议快得多

撰写回答