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
中,views 和 copies 之间存在差异,通过使用 =
您正在创建 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 集合也有这种行为,例如dict
s:
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}
我无法解释 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
中,views 和 copies 之间存在差异,通过使用 =
您正在创建 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 集合也有这种行为,例如dict
s:
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}