2016-08-23 142 views
2

匹配的字符串考虑以下数据帧大熊猫数据框中获取根据排在细胞

+-----+----------------+--------+---------+ 
|  |  A  |  B | C | 
+-----+----------------+--------+---------+ 
| 0 | [email protected] | 2.0 | Hello | 
| 1 | [email protected] | 3.0 | World | 
| 2 | [email protected] | hi  | holiday | 
+-----+----------------+--------+---------+ 

如何,我可以得到其中re.compile([Hh](i|ello))将匹配在单元格中的所有行?也就是说,从上面的例子中,我想得到以下输出:

+-----+----------------+--------+---------+ 
|  |  A  | B | C | 
+-----+----------------+--------+---------+ 
| 0 | [email protected] | 2.0 | Hello | 
| 2 | [email protected] | hi  | holiday | 
+-----+----------------+--------+---------+ 

我无法为此获得解决方案。和帮助将非常感激。

回答

2

您可以使用带正则表达式的findall函数。

msk = df.apply(lambda x: x.str.findall(r'[Hh](i|ello)')).any(axis=1) 
df[msk] 

+---|------------|------|---------+ 
| |  A  | B | C | 
+---|------------|------|---------+ 
| 0 |[email protected]| 2 | Hello | 
| 2 |[email protected]| hi | holiday | 
+---|------------|------|---------+ 

any(axis=1)将检查给定行中的任何列是否为真。所以msk是True/False值的单列,指示在该行中是否找到正则表达式。

+0

谢谢你,这是我最终使用。 (并且道歉接受那个迟到!) – dliv

3

使用stack避免apply

df.loc[df.stack().str.match(r'[Hh](i|ello)').unstack().any(1)] 

enter image description here

使用match产生未来的警告。警告与我们正在做的事情是一致的,所以这很好。然而,findall完成相同的事情

df.loc[df.stack().str.findall(r'[Hh](i|ello)').unstack().any(1)] 
+0

也谢谢你的回答! – dliv