7

我在更改重复的 pandas DataFrame 时遇到了一些麻烦,并且没有将编辑应用于重复的 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 文档和 Google 的原因,但无济于事。我完全不明白这里发生了什么。

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

4

1 回答 1

13

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

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

如果您想要一个新的 DataFrame,请使用e = d.copy().

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

于 2012-06-01T05:13:47.773 回答