python pandas中的DataFrame.apply改变了原始和重复的DataFrame

Mik*_*ruz 5 python pandas

我在更改重复的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] = xa.foo = bar)的赋值被转换为引擎盖下的方法调用,并且可以根据对象的类型进行复制a.