在大多数情况下,如果A等于B,然后修改了BA并不会受到影响,对吧?但是,在pandasdataframe数据里面,这个推论则是不存在的。这个情况到底是怎么回事呢?本文继续苏南大叔的dataframe操作。

苏南大叔:pandas的dataframe赋值操作,如何复制dataframe对象? - pandas-dataframe-copy
pandas的dataframe赋值操作,如何复制dataframe对象?(图1-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文中,将以代码对比的形式,看看pandasdataframe数据赋值操作的一些注意事项。本文测试环境:win10python@3.6.8pandas@1.1.5

代码对比

测试环境是python,普通的字符串赋值操作。

a = b = "init"
b = "modify"
print(a,b)

执行结果是:

init modify

可以看到AB是两个不同的变量,相互不影响。

换成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'

参考文献

总结

pandasdataframe对象,不按常理出牌,导致新人掉进陷阱。更多pandas的代码使用经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。