【问题标题】:How to apply pandas.DataFrame.replace on selected columns with inplace = True?如何在 inplace = True 的选定列上应用 pandas.DataFrame.replace?
【发布时间】:2018-06-23 14:43:38
【问题描述】:
import pandas as pd

df = pd.DataFrame({
    'col1':[99,99,99],
    'col2':[4,5,6],
    'col3':[7,None,9]
})

col_list = ['col1','col2']
df[col_list].replace(99,0,inplace=True)

这会生成一个警告并保持数据框不变。

SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

我希望能够对用户指定的列的子集应用替换方法。我还想使用 inplace = True 来避免复制数据框,因为它很大。任何关于如何实现这一点的想法都将不胜感激。

【问题讨论】:

  • 如果您一次循环并替换一列,它似乎可以工作,但必须有更好的选择?
  • 是的,但我有 2k 列,所以我希望有更快的方法。另外,我对 dropna 函数也有同样的问题。因为我想使用 'thresh' 参数,所以不能一次将其应用于一列。

标签: python pandas


【解决方案1】:

当您选择要替换为 df[col_list] 的列时,会创建数据框的切片(副本)。副本已更新,但从未写回原始数据帧。

您应该一次替换一列或使用嵌套字典映射:

df.replace(to_replace={'col1' : {99 : 0}, 'col2' : {99 : 0}}, 
           inplace=True)

to_replace的嵌套字典可以自动生成:

d = {col : {99:0} for col in col_list}

【讨论】:

  • 您不能从单个列中删除单元格。只有整行。
【解决方案2】:

您可以使用 loc 替换。这是您的示例 df 的略微修改版本:

d = {'col1':[99,99,9],'col2':[99,5,6],'col3':[7,None,99]}
df = pd.DataFrame(data=d)
col_list = ['col1','col2']
df.loc[:, col_list] = df.loc[:, col_list].replace(99,0)

你得到

    col1    col2    col3
0   0       0       7.0
1   0       5       NaN
2   9       6       99.0

Here 是对类似问题的一个很好的解释。

【讨论】:

  • 是的,我同意使用 loc 您可以重新分配子数据帧 +1。但是,评论:df[col_list].replace(99,0) 在右侧就足够了,并且根据我的经验,速度更快。
猜你喜欢
  • 2018-12-04
  • 2021-07-25
  • 1970-01-01
  • 2019-05-07
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多