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来避免复制数据框,因为它很大。任何有关如何实现此目标的想法将不胜感激。
答案 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是类似问题的很好解释。