首页 > 解决方案 > 从值列表中分配新列的值警告大型数据集 - Pandas

问题描述

我有一个这样的数据框列表:

sm = pd.DataFrame([["Forever", 'BenHarper'],["Steel My Kisses", 'Kack Johnson'],\
                  ["Diamond On the Inside",'Xavier Rudd'],[ "Count On Me", "Bruno Mars"]],\
                   columns=["Song", "Artist"])

pm = pd.DataFrame([["I am yours", 'Jack Johnson'],["Chasing Cars", 'Snow Patrol'],\
                  ["Kingdom Comes",'Cold Play'],[ "Time of your life", "GreenDay"]],\
                   columns=["Song", "Artist"])

df_list = [sm,pm]

现在,我有另一个值列表,我想将它们作为新列分配给我的数据框列表中的数据框。

years = ["1999", "2003"]

我使用了以下代码,(它适用于较小的数据集)

df_with_year = []
for df in df_list:
    for j in years:
        df["Year"] = j
    df_with_year.append(df)

但是,当我对更大的数据集使用相同的逻辑时,我收到了一个错误:

SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value

请参阅文档中的注意事项:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

任何想法为什么我会收到此复制错误。我浏览了提供的链接,它谈到了一个已经存在的列,在这种情况下我可以使用.loc. 就我而言,我正在创建一个新列并分配值。

标签: pythonpython-3.xpandasreplace

解决方案


如果您的 Datafamedf本身是其他的子 DataFrame parent_df,这 SettingWithCopyWarning通常是由类似df["Year"] = j或什至的行触发的df.loc[:, "Year"] = j。只要你不是试图用df["Year"] = j一种方式来修改parent_df,你总是可以放心地忽略 SettingWithCopyWarning

如果您不想看到警告,您可以通过设置全局静音它

pd.options.mode.chained_assignment = None

推荐阅读