首页 > 解决方案 > Pandas Dataframe SettingWithCopyWarning 复制方法

问题描述

我有这个程序进行演示:

import pandas as pd

d = {'foo':[100, 111, 222], 
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)

list = [333,444]

dferg = df.loc[df.bar.isin(list)]

dferg['test'] = 123

我收到警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas- 
docs/stable/indexing.html#indexing-view-versus-copy
  dferg['test'] = 123

当我改变时:

dferg = df.loc[df.bar.isin(list)]

dferg = df.loc[df.bar.isin(list)].copy()

没有更多的警告。但这是最好的方法吗?

标签: pythonpandas

解决方案


dferg = df.loc[df.bar.isin(list)]是一个 get 操作,它可以返回一个视图或一个副本。调用.copy()明确告诉它实际上是一个副本,因此不会发出警告。dferg['test'] = 123也会修改原件df,因此 pandas 会警告您,以防您可能想要使用副本而不是视图。

考虑一下您是否希望df通过您所做的任何分配来修改原始 DataFrame dferg。如果您真的想修改第一个 DataFrame,请将所有内容放在一个.loc调用中:

df.loc[df.bar.isin(list), 'test'] = 123 # sets 123 in df

否则,只需像您说的那样明确调用 copy :

dferg = df.loc[df.bar.isin(list)].copy()
dferg['test'] = 123 # ONLY modifies dferg, not original df

推荐阅读