python pandas 中的 DataFrame.apply 会更改原始和重复的 DataFrames

DataFrame.apply in python pandas alters both original and duplicate DataFrames

提问人:MikeGruz 提问时间:6/1/2012 更新时间:6/1/2012 访问量:6402

问:

我在更改复制的 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

然后,我将 'd' 数据帧分配给变量 'e',并使用 apply 对列 'a' 应用一些任意数学运算:

In [70]: e = d

In [71]: e['a'] = e['a'].apply(lambda x: x + 1)

问题出现了,因为 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

我已经搜索了熊猫文档和谷歌,以寻找为什么会这样,但无济于事。我完全不明白这是怎么回事。

我还尝试过使用元素运算(例如,),但问题仍然存在。pandas DataFrame 类型中是否有我不知道的怪癖?我很欣赏某人可能提供的任何见解。e['a'] = [i + 1 for i in e['a']]

Python 熊猫

评论


答:

14赞 BrenBarn 6/1/2012 #1

这不是熊猫特有的问题。在 Python 中,assignment 从不复制任何内容:

>>> a = [1,2,3]
>>> b = a
>>> b[0] = 'WHOA!'
>>> a
['WHOA!', 2, 3]

如果需要新的 DataFrame,请使用 进行复制。e = d.copy()

编辑:我应该澄清一下,对裸名的分配永远不会复制任何东西。对项目或属性(例如,或)的赋值在后台转换为方法调用,并且可以根据对象的类型进行复制。a[1] = xa.foo = bara

评论

0赞 MikeGruz 6/1/2012
就在我以为我已经很好地掌握了 Python 的时候!非常感谢您的回复。这是一个很大的帮助。
0赞 BrenBarn 6/6/2012
我不明白你说的“为什么它不起作用”是什么意思。它确实有效。也许你对变量名称感到困惑?我之所以这么说,是因为这些是最初问题中使用的名称。e = d.copy()