如何在inplace = True的选定列上应用pandas.DataFrame.replace?

时间:2018-06-23 00:09:10

标签: python pandas

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

我希望能够对用户指定的列的子集应用replace方法。我也想使用inplace = True来避免复制数据框,因为它很大。任何有关如何实现此目标的想法将不胜感激。

2 个答案:

答案 0 :(得分:3)

当您选择要用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}

答案 1 :(得分:1)

您可以使用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是类似问题的很好解释。