如何根据部分匹配选择DataFrame列?

Mic*_*cis 8 python pandas

今天下午我正在努力寻找一种方法来选择我的Pandas DataFrame的几列,通过检查名称中某个模式的出现(标签?).

我一直在寻找类似containsisinnd.arrays/的东西pd.series,但没有运气.

这让我很沮丧,因为我已经检查了我的列中DataFrame是否出现了特定的字符串模式,如:

hp = ~(df.target_column.str.contains('some_text') | df.target_column.str.contains('other_text'))
df_cln= df[hp]
Run Code Online (Sandbox Code Playgroud)

然而,无论我如何撞击我的头,我都无法申请.str.contains()返回的对象df.columns- 这是一个Index- 也不是返回的对象df.columns.values- 这是一个ndarray.这适用于"切片"操作返回的内容df[column_name],即a Series.

我的第一个解决方案涉及for循环和创建帮助列表:

ll = []
for a in df.columns:
    if a.startswith('start_exp1') | a.startswith('start_exp2'):
    ll.append(a)
df[ll]
Run Code Online (Sandbox Code Playgroud)

(str当然,可以应用任何功能)

然后,我找到了该map函数,并使用以下代码:

import re
sel = df.columns.map(lambda x: bool(re.search('your_regex',x))
df[df.columns[sel]]
Run Code Online (Sandbox Code Playgroud)

当然,在第一个解决方案中,我可以执行相同类型的正则表达式检查,因为我可以将它应用于str迭代返回的数据类型.

我是Python的新手,从来没有真正编程任何东西,所以我不太熟悉速度/时间/效率,但我倾向于认为第二种方法 - 使用地图 - 可能会更快,除了看起来更优雅我的未经训练眼睛.

我很想知道你对它的看法,以及可能的替代方案.考虑到我的高唱水平,如果你能纠正我在代码中犯下的任何错误并指出正确的方向,我将非常感激.

谢谢,米歇尔

编辑:我刚刚找到了Index方法Index.to_series(),它返回 - 嗯 - Series我可以应用的方法.str.contains('whatever').但是,这并不像真正的正则表达式那么强大,我找不到将结果传递Index.to_series().strre.search()函数的方法.

Rob*_*ith 14

您使用的解决方案map非常好.如果你真的想使用str.contains,可以将Index对象转换为Series(具有该str.contains方法):

In [1]: df
Out[1]: 
   x  y  z
0  0  0  0
1  1  1  1
2  2  2  2
3  3  3  3
4  4  4  4
5  5  5  5
6  6  6  6
7  7  7  7
8  8  8  8
9  9  9  9

In [2]: df.columns.to_series().str.contains('x')
Out[2]: 
x     True
y    False
z    False
dtype: bool

In [3]: df[df.columns[df.columns.to_series().str.contains('x')]]
Out[3]: 
   x
0  0
1  1
2  2
3  3
4  4
5  5
6  6
7  7
8  8
9  9
Run Code Online (Sandbox Code Playgroud)

更新我刚看完你的最后一段.从文档中,str.contains允许您默认传递正则表达式(str.contains('^myregex'))

  • 只是 `df.loc[:, df.columns.str.contains('x')]` 也可以。 (4认同)

Phi*_*arz 9

通过部分字符串选择列,方法很简单,方法是:

df.filter(like='hello')  # select columns which contain the word hello
Run Code Online (Sandbox Code Playgroud)

要通过部分字符串匹配选择行,请将axis = 0传递给过滤器:

df.filter(like='hello', axis=0) 
Run Code Online (Sandbox Code Playgroud)