根据列中的子字符串 A 或 B 从数据帧中选择行

Select rows from dataframe based on substring A or B in a column

提问人:edge-case 提问时间:1/19/2017 最后编辑:edge-case 更新时间:1/19/2017 访问量:3052

问:

对不起,我需要编辑我的问题,因为我实际上正在寻找具有多个字符的子字符串。建议的答案很好,但主要适用于一个字符串。

import panda as pd

test = pd.DataFrame({'A': 'ju1 j4 abjul boy noc s1 asep'.split(),
                 'B': [1, 2, 3, 4, 5, 6, 7]})
print(test)


       A  B
0    ju1  1
1     j4  2
2  abjul  3
3    boy  4
4    noc  5
5     s1  6
6   asep  7

我知道我可以选择所有包含“ju”的行

subset = test[test['A'].str.contains('ju')]
print(subset)

       A  B
0    ju1  1
1  abjul  3

有没有一种优雅的方法来选择所有包含“ju”或“as”的行?

这工作原理如下,还有其他方法也有效吗?

ju = test.A.str.contains('ju')
as = test.A.str.contains('as')
subset = test[ju | as]
python python-2.7 pandas 子字符串

评论

0赞 MaxU - stand with Ukraine 1/19/2017
test[test['A'].str.contains('[js]+')]
0赞 flyingmeatball 1/19/2017
测试[(test['A'].str.contains('j')) |(测试[test['A'].str.contains('s')])]

答:

1赞 piRSquared 1/19/2017 #1

选项 1
尝试使用
str.match

test[test.A.str.match('.*[js].*')]

选项 2
操作
set

s = test.A.apply(set)
test[s.sub(set(list('js'))).lt(s)]

选项 3 广播
操作
setnumpy

s = test.A.apply(set)
test[(~(np.array([[set(['j'])], [set(['s'])]]) - s.values).astype(bool)).any(0)]

选项 4
单独的条件

cond_j = test.A.str.contains('j')
cond_s = test.A.str.contains('s')
test[cond_j | cond_s]

所有产量

       A  B
0     j1  1
1     j4  2
2  abjul  3
5     s1  6
6   asep  7

时间测试

enter image description here

3赞 MaxU - stand with Ukraine 1/19/2017 #2
In [13]: test.loc[test.A.str.contains(r'[js]')]
Out[13]:
       A  B
0     j1  1
1     j4  2
2  abjul  3
5     s1  6
6   asep  7