如何应用正则表达式替换到熊猫系列包含字符串,列表?



我想找到一种方法,将正则表达式替换应用于Pandas Series的每个元素,其中该系列可能包含字符串、列表或字典。

目标是在DataFrame列保存到Google BigQuery之前替换匹配指定模式的文本实例。

我可以实现这一点没有问题,其中系列只包含字符串值,例如:

['string 1', 'string 2', 'string 3']

然而,可能存在序列包含'嵌套'数据的实例-其中序列中的每个项都是包含n字典的列表:

[ 
    [ 
         { 'val1':'string 1', 'val2':'string 2' },
         { 'val1':'string 3', 'val2':'string 4' }
    ],
    [
         { 'val1':'string 1', 'val2':'string 6' }
    ]
]

理想情况下,我将能够创建一个函数,该函数可以执行替换系列中的每个元素,而不管该系列是否包含"嵌套"值。

作为一个例子,使用上面的样例值,可能会使用该函数将'string 1'替换为'abcdef' -的实例,并产生以下输出:

['abcdef', 'string 2', 'string 3']

[ 
    [ 
         { 'val1':'abcdef', 'val2':'string 2' },
         { 'val1':'string 3', 'val2':'string 4' }
    ],
    [
         { 'val1':'abcdef', 'val2':'string 6' }
    ]
]

我曾经想过也许可以做类似下面的事情:

def regex_replace_in_series(series_item, regex_pattern, replacement):
    if type(series_item) == 'str':
        return re.sub(regex_pattern, replacement, series_item)
    elif type(series_item) == 'list': 
        return [regex_replace_in_series(item, regex_pattern, replacement) for item in series_item]
    elif type(series_item) == 'dict':
        for key in series_item:
            series_item[key] = regex_replace_in_series(series_item[key], regex_pattern, replacement)
        return series_item
    else: 
        return series_item
my_series.apply(regex_replace_in_series, args=[some_pattern, some_replacement])

但我认为这将是实现预期结果的一种相对缓慢/容易出错的方式。

有更好的方法吗?

感谢

你可以这样做:

  • 将数据框架转换为csv
  • 通过利用字符串上下文
  • 来替换您需要的字符串
  • get back your dataframe

下面是一个快速代码片段,它通过将键作为上下文来替换字典中的字符串:

import io
import re
# transforming dataframe to csv string
string_df = df.to_csv(index=False)[1:]
# applying replacements on dicts
strings_to_replace_in_dict = [('val1', 'string 1', 'abcdef')]
for key, value, replacement in strings_to_replace_in_dict:
    string_df = re.sub(r"('"+key+"': ')"+value, r"1"+replacement, string_df)
# transforming csv string back to dataframe
df = pd.read_csv(io.StringIO(string_df))

可以用类似的方法处理列表替换。

这个答案对你的问题有帮助吗?

我已经确定了在使用Python/Pandas时更适合管理嵌套数据的另一种方法。

这是基于:

  • 在包含非字符串类型(根据此问题的主题)的Pandas系列上执行某些操作(例如regex替换)的复杂性
  • 当试图在Pandas中创建'嵌套'列的'深'副本时的问题(根据pd.df.copy)

我已经得出结论,数据处理应该在数据嵌套之前执行,然后将数据保存到BigQuery:

  • :来源->巢→过程→商店
  • 正确
  • :来源->过程→巢→商店

看起来似乎可以在所有数据处理完成后使用Pandas方法的组合(包括groupby()和agg())创建所需的嵌套结构。

在此之前,我可以对仅包含str值的Series执行所有处理。

感谢所有花时间回复的人-非常感谢

最新更新