对具有很少唯一值的列使用分类 dtype 是有意义的。
演示:
df = pd.DataFrame(np.random.choice(['aa','bbbb','c','ddddd','EeeeE','xxx'], 10**6), columns=['Day'])
In [34]: %timeit list(set(df['Day']))
98.1 ms ± 2.96 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [35]: %timeit df['Day'].unique()
82.9 ms ± 56.5 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
1M 行的时间几乎相同
让我们测试类别 dtype:
In [37]: df['cat'] = df['Day'].astype('category')
In [38]: %timeit list(set(df['cat']))
93.7 ms ± 766 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [39]: %timeit df['cat'].unique()
25.1 ms ± 6.57 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
更新: 1.000.000 行中的 500 个唯一值 DF:
In [75]: a = pd.util.testing.rands_array(10, 500)
In [76]: df = pd.DataFrame({'Day':np.random.choice(a, 10**6)})
In [77]: df.shape
Out[77]: (1000000, 1)
In [78]: df.Day.nunique()
Out[78]: 500
In [79]: %timeit list(set(df['Day']))
55 ms ± 395 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [80]: %timeit df['Day'].unique()
133 ms ± 3.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [81]: df['cat'] = df['Day'].astype('category')
In [82]: %timeit list(set(df['cat']))
102 ms ± 3.64 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [83]: %timeit df['cat'].unique()
38.3 ms ± 1.47 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
结论:对你的真实数据“计时”总是更好的——你可能会得到不同的结果......