在每一列的DataFrame中查找不同元素的数量

发布于 2021-01-29 18:29:00

我正在尝试使用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
被浏览
221
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    熊猫0.20开始, 我们可以nunique直接在DataFrames上使用,即:

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看