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

ajk*_*hol 32 python numpy pandas

我试图使用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)])
Run Code Online (Sandbox Code Playgroud)

我需要计算每列的不同元素的数量,如下所示:

col0    9538
col1    9505
col2    9524
Run Code Online (Sandbox Code Playgroud)

最有效的方法是什么,因为此方法将应用于大小超过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

EdC*_*ica 48

pandas 0.20我们可以nunique直接在DataFrames 上使用,即:

df.nunique()
a    4
b    5
c    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

其他遗留选项:

您可以对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
Run Code Online (Sandbox Code Playgroud)

编辑

正如@ajcr指出的那样,转置是不必要的:

In [208]:
df.apply(pd.Series.nunique)

Out[208]:
a    4
b    5
c    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)


小智 6

APandas.Series有一个.value_counts()函数,可以准确地提供您想要的内容。查看函数的文档

  • 你能演示一下你没有发布代码和输出时的样子吗 (2认同)

San*_*ord 5

这里已经有一些很好的答案:)但是这个似乎不见了:

df.apply(lambda x: x.nunique())
Run Code Online (Sandbox Code Playgroud)

从 pandas 0.20.0 开始,DataFrame.nunique()也可用。