python - 在每列中查找 DataFrame 中不同元素的计数

标签 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)])

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

col0    9538
col1    9505
col2    9524

什么是最有效的方法,因为此方法将应用于大小大于 1.5GB 的文件?


根据答案,df.apply(lambda x: len(x.unique())) 是最快的 (notebook)。

%timeit df.apply(lambda x: len(x.unique())) 10 个循环,3 个循环中的最佳:每个循环 49.5 毫秒 %timeit df.nunique() 10 个循环,3 个循环中的最佳:每个循环 59.7 毫秒 %timeit df.apply(pd.Series.nunique) 10 个循环,3 个循环中的最佳:每个循环 60.3 毫秒 %timeit df.T.apply(lambda x: x.nunique(), axis=1) 10 个循环,3 个循环中的最佳:每个循环 60.5 毫秒

最佳答案

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

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

关于python - 在每列中查找 DataFrame 中不同元素的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30503321/

相关文章:

python - 使用 Google Cloud Functions 长时间运行的 python 进程

python - 如何在Python中使用group-by函数保留列名?

python-3.x - Pandas 合并有两个具有相同代码和输入数据的结果

python - 连接两个 Pandas 数据框而不对初始列进行排序

python - 如何为 C 分配的 numpy 数组注册析构函数?

python - 如何在 Pandas 中删除具有不同列名的重复数据?

c# - 如何导出 C# 方法?

python - Pandas dataframe 使用 groupby 对子集进行反向排序

python - 在多种条件下从数组中选择行

python - RCV 进入矩阵