今天下午我正在努力寻找一种方法来选择我的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
- 也不是{{1}返回的对象} - 这是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]]
数据类型。
我是Python的新手,从来没有真正编程任何东西所以我对速度/时间/效率并不太熟悉,但我倾向于认为第二种方法 - 使用地图 - 可能更快,除了看起来更优雅对于我未经训练的眼睛。
我很想知道你对它的看法,以及可能的替代方案。鉴于我的高唱水平,如果你能纠正我在代码中犯下的任何错误并指出我正确的方向,我将非常感激。
谢谢, 米歇尔
编辑:我刚刚找到了str
方法Index
,该方法返回 - 嗯 - Index.to_series()
我可以申请Series
。
但是,这并不像真正的正则表达式那么强大,我找不到将.str.contains('whatever')
的结果传递给Index.to_series().str
函数的方法。
答案 0 :(得分:12)
使用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
更新我刚看完你的最后一段。从documentation开始,str.contains
允许您默认传递正则表达式(str.contains('^myregex')
)
答案 1 :(得分:5)
按部分字符串选择列,通常只需完成,通过:
df.filter(like='hello') # select columns which contain the word hello
要通过部分字符串匹配选择行,请将axis = 0传递给filter:
df.filter(like='hello', axis=0)
答案 2 :(得分:1)
我认为df.keys().tolist()
是你正在寻找的东西。
A tiny example:
from pandas import DataFrame as df
d = df({'somename': [1,2,3], 'othername': [4,5,6]})
names = d.keys().tolist()
for n in names:
print n
print type(n)
<强>输出:强>
othername
type 'str'
somename
type 'str'
然后使用您获得的字符串,您可以执行任何所需的字符串操作。