在每一列的DataFrame中查找不同元素的数量
我正在尝试使用Pandas查找每列中不同值的计数。这就是我所做的。
import pandas as pd
import numpy as np
# Generate data.
NROW = 10000
NCOL = 100
df = pd.DataFrame(np.random.randint(1, 100000, (NROW, NCOL)),
columns=['col' + x for x in np.arange(NCOL).astype(str)])
我需要计算每一列的不同元素的数量,如下所示:
col0 9538
col1 9505
col2 9524
什么是最有效的方法,因为此方法将应用于大小大于1.5GB的文件?
根据答案,df.apply(lambda x:
len(x.unique()))
是最快的(笔记本)。
%timeit df.apply(lambda x: len(x.unique())) 10 loops, best of 3: 49.5 ms per
loop %timeit df.nunique() 10 loops, best of 3: 59.7 ms per loop %timeit
df.apply(pd.Series.nunique) 10 loops, best of 3: 60.3 ms per loop %timeit
df.T.apply(lambda x: x.nunique(), axis=1) 10 loops, best of 3: 60.5 ms per
loop
-
从 熊猫0.20开始, 我们可以
nunique
直接在DataFrame
s上使用,即:df.nunique() a 4 b 5 c 1 dtype: int64
其他旧选项:
您可以对df进行转置,然后逐行
apply
调用nunique
:In [205]: df = pd.DataFrame({'a':[0,1,1,2,3],'b':[1,2,3,4,5],'c':[1,1,1,1,1]}) df Out[205]: a b c 0 0 1 1 1 1 2 1 2 1 3 1 3 2 4 1 4 3 5 1 In [206]: df.T.apply(lambda x: x.nunique(), axis=1) Out[206]: a 4 b 5 c 1 dtype: int64
编辑
正如@ajcr指出的,转置是不必要的:
In [208]: df.apply(pd.Series.nunique) Out[208]: a 4 b 5 c 1 dtype: int64