pandas dictionnary of dataframes:列被更改:查看还是复制?

时间:2017-05-17 15:27:54

标签: python python-3.x pandas dictionary

我有以下奇怪的行为(使用pandas 0.19.2,python 3.5) 如果我设置了数据帧字典:

df1 = pd.DataFrame(index=['a', 'b'], columns=['c1', 'c2'], data=[[0,1],[2,3]])
df2 = pd.DataFrame(index=['a', 'b'], columns=['c1', 'c2'], data=[[4,5],[6,7]])

my_dict = {'f1': df1, 'f2': df2}

我尝试以这种方式更改列:

d = []
for key in my_dict.keys():
    df = my_dict.get(key)
    df.columns = [(key, x) for x in df.columns]
    d.append(df)

我最终改变了字典值的列。
所以my_dict现在是:

{'f1':    (f1, c1)  (f1, c2)
 a         0         1
 b         2         3,
 'f2':    (f2, c1)  (f2, c2)
 a         4         5
 b         6         7}

有什么理由吗?
我发现改变仅被引用的元素是奇怪的(并且有缺陷)。

2 个答案:

答案 0 :(得分:1)

嗯,你可能会发现它很奇怪(我可能会同意),但它没有记录:

字典在python中是可变的:https://docs.python.org/2/reference/datamodel.html

  

对象的可变性由其类型决定;例如,   数字,字符串和元组是不可变的,而字典和   列表是可变的

     

容器的示例是元组,列表和字典。该   引用是容器值的一部分。在大多数情况下,当我们   谈论一个容器的价值,我们暗示价值,而不是   所包含物体的身份;但是,当我们谈论的时候   容器的可变性,只有立即的身份   包含的对象是隐含的。所以, if 一个不可变的容器(就像一个   元组)包含对可变对象的引用,如果,其值会更改   可变对象已更改。

Pandas数据框是可变的: http://pandas.pydata.org/pandas-docs/stable/overview.html#mutability-and-copying-of-data

  

数据的可变性和复制

     

所有pandas数据结构都是   value-mutable(它们包含的值可以改变)[...]

例如,您可以将数据帧作为输入传递给函数,在函数内部修改列的名称,并且作为效果,函数外部的数据框也将被修改。

答案 1 :(得分:0)

没有错误,只是很容易错过你创建视图的地方而不是副本。由于您在字典中使用了数据框,因此以下行创建了原始df的视图:

React.createElement(Foo)

您可能想尝试

df = my_dict.get(key)