跳转至

数据切片和掩码索引,这个陷阱困扰过你吗

本文总阅读量次 ,原创教程,严禁转载

问题

在做输入数据预处理时遇到一个乍看起来比较奇怪的问题。先说一下问题。我想根据条件提取部分数据,修改这部分数据某一列的值,原本以为这样做可以修改数据源。

结果发现,并没有!

修改数据切片,会修改原数据啊! 难道根据掩码提取的数据不是对原数据的引用吗?

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({"a":[3,2,1],"b":['s','w','e']})

In [3]: df
Out[3]:
   a  b
0  3  s
1  2  w
2  1  e

### 修改数据切片
In [7]: df[:2] = pd.DataFrame({'a':[30,20],'b':['s','w']})

In [8]: df
Out[8]:
      a  b
0  30.0  s
1  20.0  w
2   1.0  e

掩码提取数据再修改

### 掩码提取数据
In [9]: df2 = df[df.a > 2]

In [10]: df2
Out[10]:
      a  b
0  30.0  s
1  20.0  w


In [18]: df2 = pd.DataFrame({'a':[300,200],'b':['s','w']})

In [19]: df
Out[19]:
      a  b
0  30.0  s
1  20.0  w
2   1.0  e

修改数据切片,原数据对应修改,因为切片是对原数据的引用;修改掩码提取的数据,原数据不改变,因为掩码返回的数据指向一块新的内存,不是原来的块引用!

总结

修改数据切片,原数据对应修改;修改掩码提取的数据,原数据不改变