将字符串替换应用于 pandas 数据框的多列

Apply a string replace to several columns of a pandas dataframe

我有一个包含多列的数据框,其中两列是带有最后片段的 URI 字符串,例如:

http://company.com/information#name

http://company.com/information#Company

我只需要保留“名称”和“公司”URI 片段,并删除井号前的字符串。

我已经编写了以下函数来对传递的数据框执行此操作,还传递了要执行的列名列表,最后是要从每个列中删除的字符串:

def uri_fragment(DF: pd.DataFrame, COLUMN_LIST: list, URI_STRING: str) -> pd.DataFrame:
    for DF_COLUMN in COLUMN_LIST:
        DF['DF_COLUMN'] = DF['DF_COLUMN'].map(lambda x: x.replace(URI_STRING,''))
    return DF

我将其调用为:

my_df = uri_fragment(my_df, ['class', 'type'], "http://company.com/information#") 

获取清除传递的 URI 字符串的“class”和“类型”数据框列。

但出现以下错误:

KeyError: 'DF_COLUMN'

我是什么overlooking/misunderstanding? 谢谢

您将字符串 'DF_COLUMN' 作为键传递,而不是循环中的变量 DF_COLUMN。由于没有名为 'DF_COLUMN' 的列,pandas 引发了 KeyError。

您在函数中使用了文字字符串。您应该删除引号:

DF[DF_COLUMN] = DF[DF_COLUMN].…

也就是说,更简单的方法是使用正则表达式。 map 会很慢:

for col in ['col', 'col2']:
    # here extracting any terminal fragment. You could also use
    # f'{URI_STRING}([^#]+)$' for limited matching
    df[col] = df[col].str.extract('#([^#]+)$', expand=False)

此外,您的代码的另一个批评者,您既 returning DF 并就地修改它。你应该只做两者之一。

要么不return任何东西并就地修改,要么return一个新的数据框。对于第二个选项,通过在函数开头添加 DF = DF.copy() 来复制 DF