如何根据部分匹配选择DataFrame列?

时间:2015-07-21 23:32:05

标签: python pandas

今天下午我正在努力寻找一种方法来选择我的Pandas DataFrame中的几列,方法是检查名称中某个模式的出现(标签?)。

我一直在为contains / isin寻找nd.arrayspd.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函数的方法。

3 个答案:

答案 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'

然后使用您获得的字符串,您可以执行任何所需的字符串操作。