从数据框中选择列(如果它们存在)

问题描述 投票:0回答:3

我有一个包含多列的 pandas DataFrame(列名称是数字;1、2、...),如果它们确实存在,我想复制其中的一些。

例如

df1 = df[[1,2,3,4]]
但可能会发生某些列在 df 中不存在的情况,例如 df 可能只有列 1、2 和 4 或列 1 和 2 等

python pandas dataframe
3个回答
38
投票

直接计算公共列的集合并求出更简单:

>>> df[df.columns.intersection([1, 2, 3, 4])]
   1  2  3
0  2  3  4

PS:原来的答案提出了更轻的和以前的等价物:

df[df.columns & [1, 2, 3, 4]]

&
运算符是DataFrame索引的(集合)交集运算符,它以前可以将列表转换为类似集合的对象。 Pandas 开始只接受
pd.DataFrame.intersection()
形式。


35
投票

使用

isin
loc
进行过滤,这将处理不存在的列:

In [97]:
df = pd.DataFrame(columns=[1,2,4])
df.loc[:,df.columns.isin([1,2,3,4,])]

Out[97]:
Empty DataFrame
Columns: [1, 2, 4]
Index: []

5
投票

一种可能的方法:

df[df.columns.intersection(set(['list', 'of', 'cols']))]

例如:

$ ipython
Python 3.8.5 (default, Sep  3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.20.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:
import pandas as pd
df = pd.DataFrame(columns=[1,2,3,4])
df
Out[1]:
Empty DataFrame
Columns: [1, 2, 3, 4]
Index: []

In [2]:
df[df.columns.intersection(set([1, 2, 2, 5]))]
Out[2]:
Empty DataFrame
Columns: [1, 2]
Index: []

In [3]:
pd.__version__
Out[3]:
'1.2.1'
© www.soinside.com 2019 - 2024. All rights reserved.