在 Pandas 中,我们可以通过名称和正则表达式选择列吗?

mja*_*ews 1 python pandas

假设我的 Pandas 数据框如下:

import pandas as pd

df = pd.DataFrame(
    dict(ID = [1, 2, 3],
         xz = [0, 1, 1],
         yz = [4, 5, 6],
         yx = [7, 11, 18],
         xy = [10, 10, 11])
)
Run Code Online (Sandbox Code Playgroud)

如果我想选择名称包含 的所有列x,我可以执行以下操作:

df.filter(regex = 'x', axis=1)
Run Code Online (Sandbox Code Playgroud)

如果我还想按列名称进行选择,我想执行以下操作,但这是行不通的。

df.filter(items = ['ID'], regex = 'x', axis=1)
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为

TypeError: Keyword arguments `items`, `like`, or `regex` are mutually exclusive`
Run Code Online (Sandbox Code Playgroud)

这是一个可行的替代方案。

df.iloc[:,df.columns.str.contains('x') | 
          df.columns.str.match('ID')]
Run Code Online (Sandbox Code Playgroud)

有更好或者更推荐的方法吗?

我知道使用 R/tidyverse(即Df %>% select(ID, contains('x')). 我还知道siuba等使用 Pandasdplython实现了大部分dplyr功能。我在这里问的是关于推荐的“基本熊猫”方式吗?

yat*_*atu 5

您可以匹配用 分隔的两个条件|,其作用类似于orfor 模式匹配。如果您想匹配确切的列名称,您还需要添加字符串的开头和结尾:

df.filter(regex = r'x|^ID$', axis=1)

   ID  xz  yx  xy
0   1   0   7  10
1   2   1  11  10
2   3   1  18  11
Run Code Online (Sandbox Code Playgroud)

查看演示


但请注意,您正在使用str.containsandstr.contains完全没问题。这只是一种更简洁的方法,但不一定更好。