pandas 按列表选择列(列是列表的子集)

4xrmg8kj  于 2023-06-04  发布在  其他
关注(0)|答案(6)|浏览(198)

我选择了一个 Dataframe 的几个列,通过列名称的列表。如果列表中的所有元素都在 Dataframe 中,则此操作可以正常工作。但是如果列表中的某些元素不在DataFrame中,那么它将生成错误“not in index”。
有没有一种方法可以选择列表中包含的所有列,即使列表中的所有元素都没有包含在 Dataframe 中?下面是一些生成上述错误的示例数据:

df   = pd.DataFrame( [[0,1,2]], columns=list('ABC') )

lst  = list('ARB')

data = df[lst]       # error: not in index
yrwegjxp

yrwegjxp1#

我想你需要Index.intersection

df = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[7,8,9],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3]})

print (df)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

lst = ['A','R','B']

print (df.columns.intersection(lst))
Index(['A', 'B'], dtype='object')

data = df[df.columns.intersection(lst)]
print (data)
   A  B
0  1  4
1  2  5
2  3  6

numpy.intersect1d的另一个解决方案:

data = df[np.intersect1d(df.columns, lst)]
print (data)
   A  B
0  1  4
1  2  5
2  3  6
dwthyt8l

dwthyt8l2#

很少有其他方法,列表理解要快得多

In [1357]: df[df.columns & lst]
Out[1357]:
   A  B
0  1  4
1  2  5
2  3  6

In [1358]: df[[c for c in df.columns if c in lst]]
Out[1358]:
   A  B
0  1  4
1  2  5
2  3  6

时间

In [1360]: %timeit [c for c in df.columns if c in lst]
100000 loops, best of 3: 2.54 µs per loop

In [1359]: %timeit df.columns & lst
1000 loops, best of 3: 231 µs per loop

In [1362]: %timeit df.columns.intersection(lst)
1000 loops, best of 3: 236 µs per loop

In [1363]: %timeit np.intersect1d(df.columns, lst)
10000 loops, best of 3: 26.6 µs per loop

详细信息

In [1365]: df
Out[1365]:
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

In [1366]: lst
Out[1366]: ['A', 'R', 'B']
tzcvj98z

tzcvj98z3#

这里一个非常简单的解决方案是使用filter()。在您的示例中,只需键入:

df.filter(lst)

并且它将自动忽略任何缺失的列。有关更多信息,请参阅documentation for filter
一般来说,filter是一种非常灵活和强大的选择特定列的方法。特别是,您可以使用正则表达式。借用@jezrael的示例数据,您可以键入以下任一项。

df.filter(regex='A|R|B')
df.filter(regex='[ARB]')

这些都是很简单的例子,但是假设你只想要以这些字母开头的列,那么你可以输入:

df.filter(regex='^[ARB]')

FWIW,在一些快速的计时中,我发现这比列表解析方法更快,但我不认为速度在这里真的是一个很大的问题-即使是最慢的方法也应该足够快,因为速度不取决于 Dataframe 的大小,只取决于列的数量。
老实说,所有这些方法都很好,你可以用任何对你来说最具可读性的方法。我更喜欢filter,因为它很简单,同时也比简单的交集提供了更多的选择列的选项。

wgx48brx

wgx48brx4#

使用*与列表
data = df[[*lst]]
它会给予想要的结果。

wnavrhmk

wnavrhmk5#

我发现这是选择列子集的最佳和最有效的方法。

mklgxw1f

mklgxw1f6#

请试试这个:

语法:DataframeList of Columns
例如:df'a','b'

a

Out[5]: 
    a  b   c
0   1  2   3
1  12  3  44

X是要切片的req列的列表

x = ['a','b']

这会给予你一个req切片:

a[x]

Out[7]: 
    a  b
0   1  2
1  12  3

性能:

%timeit a[x]
333 µs ± 9.27 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

相关问题