df = pd.DataFrame({'a':np.random.randn(1000), 'b':np.random.randn(1000), 'c':np.random.randn(1000), 'd':np.random.randn(1000),
'e':np.random.randn(1000), 'f':np.random.randn(1000), 'g':np.random.randn(1000), 'h':np.random.randn(1000),
'i':np.random.randn(1000), 'j':np.random.randn(1000), 'k':np.random.randn(1000), 'l':np.random.randn(1000)})
我有这样一个带有(很多)列的数据框。
col_of_interest = ['a','f', 'j', 'k', 'c']
我只想选择一个保存在列表中的子集。
%timeit df.loc[:, df.columns.isin(col_of_interest)]
%timeit df[col_of_interest]
%timeit df[[c for c in df.columns if c in col_of_interest]]
%timeit df[np.intersect1d(df.columns, col_of_interest)]
%timeit df[df.columns & col_of_interest]
803 µs ± 289 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.92 ms ± 324 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2.18 ms ± 406 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2.53 ms ± 194 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.39 ms ± 34.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
df[col_of_interest]
并不是最佳解决方案,我感到有些惊讶,并且对是否有比df.loc[:, df.columns.isin(col_of_interest)].
更好/更有效的方法很感兴趣
答案 0 :(得分:2)
在我的机器上,np.in1d
的运行速度稍快一些,尽管对于相对较少的列,差异可以忽略不计:
%timeit df.loc[:, np.in1d(df.columns, col_of_interest)]
# 493 µs ± 2.59 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
您还可以使用sets
检查性能,这可能会减少大量列的时间复杂度:
%timeit df.loc[:, set(df.columns).intersection(col_of_interest)]
# 915 µs ± 65.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)