今天下午我正在努力寻找一种方法来选择Pandas DataFrame的几列,方法是检查它们名称中的特定模式(标签?)的出现情况。如何根据部分匹配选择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]
但是,不管我怎么撞我的头,我可以对df.columns
返回的对象不适用.str.contains()
- 这是Index
- 也不是由df.columns.values
返回的对象 - 这是ndarray
。这对于“切片”操作df[column_name]
,即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]]
课程,我可以有PERFO第一方案的因为我可以将它应用于由迭代返回的str
数据类型。
我对Python很新,从来没有真正编写过任何程序,所以我对速度/时间/效率不太熟悉,但我倾向于认为第二种方法 - 使用地图 - 可能会更快,除了查看更多优雅对我的未经训练的眼睛。
我很想知道你对它的看法,以及可能的替代方案。考虑到我的noobness级别,如果你能纠正我在代码中犯的任何错误,并指出我朝着正确的方向,我将非常感激。
感谢, 米歇尔
编辑:我刚刚发现了Index
方法Index.to_series()
,它返回 - EHM - 一个Series
,而我可以申请.str.contains('whatever')
。 然而,这并不像一个真正的正则表达式的强大,我找不到合格的Index.to_series().str
结果到re.search()
功能的方式..
注:系列过滤器支持正则表达式 – yuval