我正在尝试使用 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/