将字符串替换应用于 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
。
我有一个包含多列的数据框,其中两列是带有最后片段的 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
。