pandas dataframe根据单元格中的匹配字符串获取行

时间:2016-08-23 15:10:42

标签: python pandas dataframe

给出以下数据框

+-----+----------------+--------+---------+
|     |       A        |     B  |    C    |
+-----+----------------+--------+---------+
| 0   | hello@me.com   | 2.0    | Hello   |
| 1   | you@you.com    | 3.0    | World   |
| 2   | us@world.com   | hi     | holiday |
+-----+----------------+--------+---------+

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

+-----+----------------+--------+---------+
|     |       A        |    B   |    C    |
+-----+----------------+--------+---------+
| 0   | hello@me.com   | 2.0    | Hello   |
| 2   | us@world.com   | hi     | holiday |
+-----+----------------+--------+---------+

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

2 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:2)

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

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

+---|------------|------|---------+
|   |     A      |  B   |    C    |
+---|------------|------|---------+
| 0 |hello@me.com|  2   |  Hello  |
| 2 |us@world.com|  hi  | holiday |
+---|------------|------|---------+

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