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)
这里已经有一些很好的答案:)但是这个似乎不见了:
df.apply(lambda x: x.nunique())
Run Code Online (Sandbox Code Playgroud)
从 pandas 0.20.0 开始,DataFrame.nunique()也可用。
| 归档时间: |
|
| 查看次数: |
44625 次 |
| 最近记录: |