Pandas 0.13.0rc1 中引入的SettingWithCopyWarning 会提醒用户在 DataFrame 的切片或副本上设置值时存在潜在问题。此警告旨在防止混淆和意外行为。
该警告是由于“链式分配”而产生的,其中在 DataFrame 的切片或副本上设置值,例如as:
df[df['A'] > 2]['B'] = new_val # new_val not set in df
在此示例中,第一个选择 (df[df['A'] > 2]) 返回一个副本,并尝试在此副本上设置“B”不会更新原始 DataFrame“df”。要正确更新“df”,请使用 loc 访问器:
df.loc[df['A'] > 2, 'B'] = new_val
如果您确定不需要将更改反映回原始 DataFrame,则可以禁用警告:
import pandas as pd pd.options.mode.chained_assignment = None # default='warn'
对于切片或副本的赋值,请使用 loc 或 iloc 访问器,它们允许直接修改原始 DataFrame:
df.loc[df['A'] > 2, 'B'] = new_val df.iloc[2:5, 4] = [1, 8, 8]
如果您需要 DataFrame 的新引用,请在修改之前使用 DataFrame.copy() 创建副本:
new_df = df.copy() new_df['C'] = df['A'] + df['B']
在您的具体情况下,您可以重新生成具有所需更改的新 DataFrame,而不是修改原始 quote_df:
quote_df = pd.read_csv(StringIO(str_of_all), sep=',', names=list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg')) quote_df.rename(columns={'A':'STK', 'B':'TOpen', ...}, inplace=True) quote_df['TVol'] = quote_df['TVol'] / TVOL_SCALE quote_df['TAmt'] = quote_df['TAmt'] / TAMT_SCALE quote_df['TDate'] = quote_df.TDate.map(lambda x: x[0:4]+x[5:7]+x[8:10])
以上是如何理解和处理Pandas的SettingWithCopyWarning?的详细内容。更多信息请关注PHP中文网其他相关文章!