选择带有列表的熊猫列

时间:2019-05-13 11:49:09

标签: python pandas data-science

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)].更好/更有效的方法很感兴趣

1 个答案:

答案 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)