【问题标题】:Filter pandas dataframe by row with regex使用正则表达式逐行过滤熊猫数据帧
【发布时间】:2019-07-18 20:09:04
【问题描述】:

我确信可能有一个简单的解决方案,但我对 Python 还是很陌生。 我有一个带有字符串和 NaN 值的 Pandas DataFrame。在这个 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"

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

【问题讨论】:

    标签: python regex pandas dataframe


    【解决方案1】:

    出于测试目的,我将源 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]])
    

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

    第一步是将这个DataFrame转换成一个SeriesNaN 值被过滤掉:

    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.

    【讨论】:

    • 非常感谢!实际上我不想有布尔值......我只想返回包含搜索字符串(?)的数据框的整个单元格。
    猜你喜欢
    • 2017-06-18
    • 2018-01-11
    • 1970-01-01
    • 2016-01-15
    • 2021-08-09
    • 2013-02-25
    • 2020-10-23
    • 2017-07-13
    • 2018-12-25
    相关资源
    最近更新 更多