[英]How to select rows in Pandas dataframe based on string matching in multiple columns
[英]How to select DataFrame columns based on partial matching?
今天下午我正在努力寻找一种方法来选择我的 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
返回的一个也没有- 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.