如何基于部分匹配选择DataFrame列?

发布于 2021-01-29 17:18:07

今天下午,我在努力寻找一种方法,通过检查其名称(标签?)中某种模式的出现来选择我的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]

但是,无论如何敲打头,我都无法应用于.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]

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

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

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

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

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

我很想知道您对此有什么看法,还有什么可能的替代选择。考虑到我的粗暴程度,如果您能纠正我在代码中可能犯的任何错误并为我指明正确的方向,我将不胜感激。

谢谢,米歇尔

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

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您使用的解决方案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
    

    更新 我刚刚阅读了您的最后一段。在文档中str.contains默认情况下允许您传递正则表达式(str.contains('^myregex')



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看