今天下午我正在努力寻找一种方法来选择我的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]
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().str给re.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.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)