繁体   English   中英

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

[英]How to select DataFrame columns based on partial matching?

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

我一直在寻找类似containsisinnd.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] ,即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 -一个Series ,而我可以申请.str.contains('whatever') 但是,这并不像真正的正则表达式那么强大,而且我找不到将Index.to_series().str的结果传递给re.search()函数的方法。

按部分字符串选择列,可以简单地完成,通过:

df.filter(like='hello')  # select columns which contain the word hello

并且要通过部分字符串匹配来选择行,您可以通过 axis=0 来过滤:

df.filter(like='hello', axis=0) 

您使用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')

我认为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'

然后用你得到的字符串,你可以做任何你想做的字符串操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM