如何基于部分匹配选择DataFrame列?
今天下午,我在努力寻找一种方法,通过检查其名称(标签?)中某种模式的出现来选择我的Pandas DataFrame的几列。
我一直在寻找类似contains
或isin
为nd.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().str
给re.search()
函数的方法。
-
您使用的解决方案
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')
)