Pandas對象修改的視圖模式和副本模式

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
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,142評論 1 32
  • 1.設計模式是什么? 你知道哪些設計模式,并簡要敘述?設計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,194評論 0 12
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,446評論 0 9
  • 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型的...
    iOS菜鳥大大閱讀 739評論 0 1
  • ??調(diào)伏身心:站樁、靜坐、練毛筆字 ??布施之道:顏布施,微笑處事,微笑面對一切人和事;言布施,說贊美安慰的話;心...
    陳俊寧閱讀 322評論 0 0