【问题标题】:How to replace old string values in Series/column of dataframe with values from dict?如何用字典中的值替换数据框系列/列中的旧字符串值?
【发布时间】:2018-08-13 16:45:42
【问题描述】:

这个问题有点类似于:Remap values in pandas column with a dict,但是,答案已经过时了,没有涵盖“SettingWithCopyWarning”。

我只是想使用字典“dict1”替换我的数据框“df”的列“col”中的原始字符串。这是我成功替换值的代码:

    temp_series = df.loc[:,col].copy()
    for name in temp_series:
        for old, new in q_names_dict.items():
            if (old.lower() == name.lower()):
                temp_series.replace(name, new, inplace=True)

-但是,当我尝试使用此副本“temp_series”更新我的原始数据框时,我得到一个“SettingWithCopyWarning”。这是引发该警告的代码:

df.loc[:,col] = temp_series
# The bottom three don't work either.
#df[col] = temp_series 
#df.loc[:,col].update(temp_series) 
#df[col].update(temp_series)      

【问题讨论】:

  • 您有什么理由不使用df.replace 方法本身(显示在链接帖子的第一个答案中)并完全避免错误和显式循环?
  • df.replace 方法更快更好,但是它不允许任何正则表达式忽略字典值和原始字符串之间的大小写。这就是我使用循环并在字符串上调用 '.lower()' 方法的原因。
  • 你不能在它前面加上 (?i) 让它不区分大小写吗?
  • 抱歉,.replace() 的数据框版本确实允许使用正则表达式。但是,我真的不知道如何使用替换函数中的语法为忽略大小写( (?i) )添加正则表达式的前缀。例如,在我上面提供的链接中,用户说要做:“df.replace({"col1": di})”。你怎么能添加正则表达式呢?谢谢
  • 这只是我抛出的一个想法 - 目前在移动设备上,因此无法正确检查/查看。

标签: python-3.x pandas dataframe series


【解决方案1】:

通过将深层副本更改为浅层副本,我能够对原始数据帧“df”进行更改。文档中有说明:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.copy.html

下面是启用浅拷贝的代码:

temp_series = df.loc[:,col].copy(deep=False)

因此,我不必在使用上述代码后显式更新我的数据框。这也可以防止 SettingWithCopyWarning。

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 2014-03-20
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多