我在更改重复的pandas DataFrame时遇到了一些麻烦,并且没有将编辑应用于重复和原始DataFrame.
这是一个例子.假设我从字典列表中创建一个任意DataFrame:
In [67]: d = [{'a':3, 'b':5}, {'a':1, 'b':1}]
In [68]: d = DataFrame(d)
In [69]: d
Out[69]:
a b
0 3 5
1 1 1
Run Code Online (Sandbox Code Playgroud)
然后我将'd'数据帧分配给变量'e',并使用apply将一些任意数学运算应用于'a'列:
In [70]: e = d
In [71]: e['a'] = e['a'].apply(lambda x: x + 1)
Run Code Online (Sandbox Code Playgroud)
问题出现了,apply函数显然适用于重复的DataFrame'e'和原始的DataFrame'd',我不能在生活中弄清楚:
In [72]: e # duplicate DataFrame
Out[72]:
a b
0 4 5
1 2 1
In [73]: d # original DataFrame, notice the alterations to frame 'e' were also applied
Out[73]:
a b
0 4 5
1 2 1
Run Code Online (Sandbox Code Playgroud)
我搜索了大熊猫文档和谷歌,原因是这样,但无济于事.我无法理解这里发生了什么.
我也尝试使用逐元素操作(例如e['a'] = [i + 1 for i in e['a']])进行数学运算,但问题仍然存在.在我不知道的pandas DataFrame类型中有一个怪癖吗?我感谢有人可能提供的任何见解.
Bre*_*arn 11
这不是熊猫特有的问题.在Python中,赋值从不复制任何东西:
>>> a = [1,2,3]
>>> b = a
>>> b[0] = 'WHOA!'
>>> a
['WHOA!', 2, 3]
Run Code Online (Sandbox Code Playgroud)
如果您想要一个新的DataFrame,请使用e = d.copy().
编辑:我应该澄清,对一个裸名的任务永远不会复制任何东西.对项目或属性(例如,a[1] = x或a.foo = bar)的赋值被转换为引擎盖下的方法调用,并且可以根据对象的类型进行复制a.