用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

一共有多少条数据?这大概是数据分析工作最基本的内容吧。 这里,我们来聊一聊如何获取 Pandas 中 DataFrame 的行数。 首先准备一个用于测试的 DataFrame 。这个 DataFrame 有 3 列,名称分别为 a 、 b 和 c :

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'a':[None,2,3], 'b':[4,5,6], 'c':[7,8,9]})
>>> df
     a  b  c
0  NaN  4  7
1  2.0  5  8
2  3.0  6  9

茴香豆一: count

SQL 语句有一个 SELECT count (*) FROM some_table , DataFrame 同样有一个 count 函数可以用来计数,示例如下:

>>> df['a'].count()
2

等等,怎么会是 2 ?结果应该是三才对啊!原来, count 会把 NaN 剔除, a 列中有 NaN ,所以结果不对,我们看看 b 列就对了:

>>> df['b'].count()
3

可是,我们不能保证每一次碰到的 b 列都没有空值啊,于是我们自己造一列出来:

>>> df['aa'] = 1
>>> df
     a  b  c  aa
0  NaN  4  7   1
1  2.0  5  8   1
2  3.0  6  9   1
>>> df['aa'].count()
3

好吧,至此,任务勉强完成了,但是……有一点丑陋。

茴香豆二: shape

经过艰苦卓绝的学习,我发现 DataFrame 有一个 shape 函数。这是一个奇妙的函数,示例如下:

>>> df.shape
(3, 3)

于是,这样就可以得到结果了:

>>> df.shape[0]
3

厉害吧,神奇吧。 但是 shape 得到的是两个数字,我们只要一个数字,在这里,是不是有点浪费呢?

茴香豆三: len

Python 有一个内置的 len ,一般来说,内置的东西总是高级一点。我们来试试:

>>> len(df)
3

那么这个 len 背后又是什么呢?在 IPython 中检查一下:

In [1]: df.__len__??
Signature: df.__len__() -> int
Source:
    def __len__(self) -> int:
        """
        Returns length of info axis, but here we use the index.
        """
        return len(self.index)

上面的 shape 又是什么呢?

In [2]: df.shape??
Type:        property
Source:
# df.shape.fget
@property
def shape(self) -> Tuple[int, int]:
    """
    Return a tuple representing the dimensionality of the DataFrame.
    ......
    """
    return len(self.index), len(self.columns)

茴香豆四: index

从以上两个源代码可以看出,我们应当这样使用 len :

>>> len(df.index)
3

茴香豆五: 再来三个

山外青山楼外楼, Python 永远还有茴香豆。再来三个:

df.index.size
len(df.axes[0])
df.pipe(len)