Pandas對象修改的視圖模式和副本模式
- 視圖模式
- 將一個對象整體賦值給另一個變量
- 修改一個變量,另一個變量值也會變
- 多個變量數(shù)據(jù)指向同一內(nèi)存數(shù)據(jù)
- 副本模式
- 將一個對象查詢的一部分值賦值給另一個變量
- 修改一個變量,另一個變量值不會變
- 當將一個對象整體賦值給另一個變量時,視圖模式,兩個變量對應的內(nèi)存地址相同,修改一個變量,另一個變量也會改變。
- 當使用copy()將一個對象賦值給另一個變量時
- 或者使用查詢賦值,查詢數(shù)據(jù)的一部分并賦值給其他變量
- 當賦值為原數(shù)據(jù)查詢的一部分時,是副本模式,修改一個變量不會影響另一個變量
import numpy as np
import pandas as pd
a_values = [
['小明','male',18,170.1,60,'北京海淀',61],
['小華','female',28,160,50,'上海靜安',74],
['小紅','female',22,175,64,'廣州天河',59],
['小靑','male',31,182,80,'深圳南山',82],
['小蘭','female',25,165,55,'杭州西湖',98],
]
a = pd.DataFrame(
a_values,
index=[1,2,3,4,5],
columns=['name','sex','age','heigh','weight','address','grade']
)
a
image.png
直接修改單元格值
a.loc[1, 'name']
a.loc[1, 'name'] = '大明'
a
image.png
視圖模式修改
兩個變量指向同一塊內(nèi)存地址,一個修改,另一個會跟著改變
b = a
b
image.png
b.loc[1, 'name'] = '大明明'
b
image.png
a
image.png
副本模式修改
- 使用copy()賦值
- 查詢數(shù)據(jù)數(shù)據(jù)的一部分賦值
c = a.copy()
c
image.png
c.loc[1, 'name'] = '大黑黑'
c
image.png
a
image.png
變量查詢一部分數(shù)據(jù)
理論上是副本模式,但實際上,直接修改賦值變量時會報警告(能修改成功)
d = a[['name', 'sex', 'address']] # 表格一部分賦值給新變量
d
image.png
d.loc[1, 'name'] = '小黑黑' # 表格一部分賦值給新變量,修改會報警告,但可以修改成功
d
e:\Anaconda3\lib\site-packages\pandas\core\indexing.py:189: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
e:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
"""Entry point for launching an IPython kernel.
image.png
a
image.png
如果需要從一個大表格中抽取部分數(shù)據(jù)賦值給另一個變量,還要修改新變量值,最好使用copy()副本模式賦值
d2 = a[['name', 'sex', 'address']].copy() # 用copy()方式賦值給新變量
d2
image.png
d2.loc[1, 'name'] = '小黑黑' # 用copy()方式賦值給新變量,修改不報警告
d2
image.png
a
image.png
不要使用下面的修改方法,鏈式調(diào)用錯誤
a
image.png
d
image.png
# d.loc[1]['name'] = '小白白'
d[0:1]['name'] = '小白白2'
e:\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
d
image.png
a
image.png