提问人:MikeGruz 提问时间:6/1/2012 更新时间:6/1/2012 访问量:6402
python pandas 中的 DataFrame.apply 会更改原始和重复的 DataFrames
DataFrame.apply in python pandas alters both original and duplicate DataFrames
问:
我在更改复制的 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']]
答:
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] = x
a.foo = bar
a
评论
0赞
MikeGruz
6/1/2012
就在我以为我已经很好地掌握了 Python 的时候!非常感谢您的回复。这是一个很大的帮助。
0赞
BrenBarn
6/6/2012
我不明白你说的“为什么它不起作用”是什么意思。它确实有效。也许你对变量名称感到困惑?我之所以这么说,是因为这些是最初问题中使用的名称。e = d.copy()
评论