pandas的dataframe赋值操作,如何复制dataframe对象?
发布于 作者:苏南大叔 来源:程序如此灵动~
在大多数情况下,如果A
等于B
,然后修改了B
,A
并不会受到影响,对吧?但是,在pandas
的dataframe
数据里面,这个推论则是不存在的。这个情况到底是怎么回事呢?本文继续苏南大叔的dataframe
操作。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文中,将以代码对比的形式,看看pandas
的dataframe
数据赋值操作的一些注意事项。本文测试环境:win10
,python@3.6.8
,pandas@1.1.5
。
代码对比
测试环境是python
,普通的字符串赋值操作。
a = b = "init"
b = "modify"
print(a,b)
执行结果是:
init modify
可以看到A
和B
是两个不同的变量,相互不影响。
换成dataframe
的赋值操作。
import pandas as pd
from pandas import Series, DataFrame
df = DataFrame([
('虎子', 5, "puppy"),
('老许', 3, "catty"),
],
columns=('name', 'age', 'class')
)
df2 = df
df.pop("age")
print(df)
print(df2)
直接结果是:
name class
0 虎子 puppy
1 老许 catty
name class
0 虎子 puppy
1 老许 catty
可以看到当类型换成dataframe
的时候,两者变成相互影响了。
正确的操作方式
对于dataframe
来说,这样的需求应该使用.copy()
来完成。范例代码:
import pandas as pd
from pandas import Series, DataFrame
df = DataFrame([
('虎子', 5, "puppy"),
('老许', 3, "catty"),
],
columns=('name', 'age', 'class')
)
df3 = df.copy()
df.pop("age")
print(df)
print(df3)
执行结果:
name class
0 虎子 puppy
1 老许 catty
name age class
0 虎子 5 puppy
1 老许 3 catty
核心代码:
df3 = df.copy()
错误的推论
值得一提的是,这个.copy()
并不是存在于任何对象之上。比如字符串上就没有这个.copy()
操作。
测试代码:
b = "init"
a = b.copy()
b = "modify"
print(a,b)
报错如下:
AttributeError: 'str' object has no attribute 'copy'
参考文献
- https://newsn.net/say/php-clone.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.copy.html
总结
pandas
的dataframe
对象,不按常理出牌,导致新人掉进陷阱。更多pandas
的代码使用经验文章,请点击:


