使用正则表达式

时间:2019-02-25 12:08:43

标签: python regex pandas dataframe

我确定可能有一个简单的解决方案,但我对Python还是很陌生。 我有一个Pandas DataFrame,其中包含字符串和NaN值。在此数据框中,我想搜索字符串的特殊部分。这应该逐行完成,找到的字符串将被写入与Dataframe具有相同行数的列表中(这意味着如果我要查找的部分字符串在该行中无法匹配,则列表中的条目应为“无”)。

我尝试过:result.loc[result[0].str.contains("hello", na=False)] 但这只会让我返回第一列包含hello ...一词的行。

我正在考虑在每行中使用正则表达式进行for循环搜索:

row = df.iloc[0:100]
for item in row:
    row_dict={}
    hello = re.search(r"hello.*", item)
    if hello is None:
       hello = "NaN"

也许还有更简单的方法? 谢谢!

1 个答案:

答案 0 :(得分:0)

出于测试目的,我将源DataFrame定义为:

df = pd.DataFrame(data=[
    ['Halo Mike', 'How are you?', np.nan],
    ['Hello John', 'Good morning', 'What a nice day'],
    ['Ello Jack', 'Xyz hello abc', np.nan]])

如您所见,有两个元素包含 hello 和 2个 NaN 元素。 列名在这里不是必需的,因此我没有定义它们。

第一步是将此DataFrame转换为 Series , 过滤出 NaN 值:

ser = pd.Series(data=df.values.flatten()).dropna()

df.values获取基础的 Numpy 数组,flatten对其进行整形 到一维数组,然后dropna删除 NaN 值。

然后,要获取该系列元素的内部带有hello(不区分大小写), 运行:

ser[ser.str.contains('hello', case=False)].tolist()

对于我们的测试数据,结果为:

['Hello John', 'Xyz hello abc']

我认为,这正是您在评论中所描述的。

对于实际输入数据(比我的示例更长),如果要限制 搜索到仅100个初始行,将df.values更改为 df.head(100).values