分配给父DataFrame会影响子DataFrame吗?

时间:2016-04-07 16:05:43

标签: python python-3.x pandas copy

documentation和众多的SO答案澄清了对孩子的分配" DataFrame可能会也可能不会反映在" parent" DataFrame(取决于某些条件)。

相反的情况如何:分配给父母"是真的吗? DataFrame可能会也可能不会反映在" child" DataFrame和取决于完全相同的条件

我注意到在分配给父母"时,似乎没有提出SettingWithCopy警告。数据帧;这也不是在文档中讨论的。

df_parent = pd.DataFrame({'a': [2,2,3,3], 'b': range(4)})
df_child = df_parent[df_parent['a']==2]
df_child.loc[0,'a'] = 100 # `SettingWithCopy` warning
df_parent.loc[0, 'a'] = 1000 # no warning; but unclear if df_child is updated?

1 个答案:

答案 0 :(得分:0)

来自文档:

  

所有pandas数据结构都是值可变的(它们包含的值)   可以改变)但不总是大小可变的。系列的长度   无法更改,但是,例如,列可以插入到   数据帧。但是,绝大多数方法都会产生新的对象   并保持输入数据不变。但总的来说,我们喜欢   在合情合理的情况下支持不变性。

在两个方向上“工作”:

In [83]: df
Out[83]:
   a  b  c
0  0  9  5
1  9  1  5
2  7  0  0
3  3  6  9
4  4  0  8
5  4  5  8
6  1  3  6
7  4  4  9
8  6  7  4
9  2  9  6

In [84]: copy.ix[0,'a'] = 100

In [85]: copy
Out[85]:
     a  b  c
0  100  9  5
1    9  1  5
2    7  0  0
3    3  6  9
4    4  0  8
5    4  5  8
6    1  3  6
7    4  4  9
8    6  7  4
9    2  9  6

In [86]: df
Out[86]:
     a  b  c
0  100  9  5
1    9  1  5
2    7  0  0
3    3  6  9
4    4  0  8
5    4  5  8
6    1  3  6
7    4  4  9
8    6  7  4
9    2  9  6

如果您想要DF的独立副本,请使用.copy()

In [89]: df
Out[89]:
   a  b  c
0  3  4  2
1  9  5  1
2  1  9  0

In [90]: copy = df.copy()

In [91]: df.ix[0,'a'] = 100

In [92]: df
Out[92]:
     a  b  c
0  100  4  2
1    9  5  1
2    1  9  0

In [93]: copy
Out[93]:
   a  b  c
0  3  4  2
1  9  5  1
2  1  9  0