Pandas 数据框和赋值

Pandas dataframe and assigning values

我无法解释 pandas 数据帧的行为。我希望有人能帮我解决这个问题。

import pandas as pd
df = pd.DataFrame(np.array([[1, 5, 10]]), columns=["Jan", "Fév", "Mar"])
df2 = pd.DataFrame(np.array([[4, 4, 4]]), columns=["Jan", "Fév", "Mar"])

df
    Jan Fév Mar
0   1   5   10

df2
    Jan Fév Mar
0   4   4   4

所以布尔值 df < df2 和 df >= df2 分别是:

df < df2
    Jan     Fév     Mar
0   True    False   False

df >= df2
    Jan     Fév     Mar
0   False   True    True

但是,如果我执行以下代码序列:

df3 = df2
df3[df < df2] = 0
df3[df >= df2] = 7

我会得到结果:

df3
    Jan Fév Mar
0   7   7   7

df2
    Jan Fév Mar
0   7   7   7

我的问题是:为什么我的代码也修改了 df2 的值?

是因为df3 = df2吗?

pandas 中,viewscopies 之间存在差异,通过使用 = 您正在创建 view,应用于它的更改也应用于原始文件,而不是副本。考虑以下简单示例

import pandas as pd
df1 = pd.DataFrame({'x':[1,2,3]})
df2 = df1
df3 = df1.copy()
df3['x'] = 0
print(df1)

输出

   x
0  1
1  2
2  3

然后

df2['x'] = 0
print(df1)

给出输出

0    0
1    0
2    0

如果您想了解更多信息,请阅读 Views and Copies in pandas in Practical Data Science

请注意 built-in python 集合也有这种行为,例如dicts:

d1 = dict(x=1,y=2)
d2 = d1
d3 = d1.copy()
d3['x'] = 0
print(d1)  # {'x': 1, 'y': 2}
d2['x'] = 0
print(d1)  # {'x': 0, 'y': 2}