我有以下奇怪的行为(使用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}
有什么理由吗?
我发现改变仅被引用的元素是奇怪的(并且有缺陷)。
答案 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)