📌  相关文章
📜  试图在 DataFrame 中的切片副本上设置一个值. - Python (1)

📅  最后修改于: 2023-12-03 15:28:09.608000             🧑  作者: Mango

在DataFrame中设置值时出现“试图在 DataFrame 中的切片副本上设置一个值”错误
错误原因

在Pandas DataFrame中进行操作时,我们有时候会遇到“试图在 DataFrame 中的切片副本上设置一个值”错误。这个错误是由于Pandas的数据结构的特殊结构和潜在的链式索引操作所导致的。

例如,考虑以下示例代码:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [1, 2, 3, 4], 'C': [1, 2, 3, 4]})
df1 = df.iloc[1:3, :]
df1['A'] = 0

这将抛出以下错误:

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
解决方案

1. 显式地用.loc.iloc赋值

根据错误提示,可以使用.loc.iloc来明确引用数据框上的具体部分,以避免引用切片副本。例如,以下示例代码:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [1, 2, 3, 4], 'C': [1, 2, 3, 4]})
df1 = df.iloc[1:3, :]
df.loc[df1.index,'A'] = 0

2. 使用.copy()创建一个完整数据框的副本

第二种解决方法是使用.copy()复制一个完整的数据框。以下是示例代码:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [1, 2, 3, 4], 'C': [1, 2, 3, 4]})
df1 = df.iloc[1:3, :].copy()
df1['A'] = 0

3. 禁用链式索引操作

第三种解决方法是禁用链式索引操作,以避免出现该错误。可以在代码开头加入以下代码:

pd.options.mode.chained_assignment = None  # default='warn'
结论

遇到“试图在 DataFrame 中的切片副本上设置一个值”错误时,可以使用.loc.iloc来明确引用数据框上的具体部分,或者使用.copy()复制一个完整的数据框,或者禁用链式索引操作来解决错误。