case 1在pandas文檔中有一個操作:交換兩列的value
import pandas as pd
import numpy as np
values = np.arange(40).reshape(10,4)
dates = pd.date_range('2022-01-01',periods=10)
df = pd.DataFrame(values,index=dates,columns=list('ABCD'))
df[['B','A']] = df[['A',"B"]] #[] 可以接受 list
#輸出結果:完成A 、B列swap value
A B C D
2022-01-01 1 0 2 3
2022-01-02 5 4 6 7
2022-01-03 9 8 10 11
2022-01-04 13 12 14 15
2022-01-05 17 16 18 19
2022-01-06 21 20 22 23
2022-01-07 25 24 26 27
2022-01-08 29 28 30 31
2022-01-09 33 32 34 35
2022-01-10 37 36 38 39
df[['B','H']] = df[['A',"B"]] # A的value換到B列,H列為新增列,它的value為B列上的raw value 即原始值
#輸出:上述賦值的左邊其實在為df創建新的列,H列即為新列名,df[['B','A']] = df[['A',"B"]] 中也是同理,只不過新列名與原始同名,會直接被重寫
A B C D H
2022-01-01 0 0 2 3 1
2022-01-02 4 4 6 7 5
2022-01-03 8 8 10 11 9
2022-01-04 12 12 14 15 13
2022-01-05 16 16 18 19 17
2022-01-06 20 20 22 23 21
2022-01-07 24 24 26 27 25
2022-01-08 28 28 30 31 29
2022-01-09 32 32 34 35 33
2022-01-10 36 36 38 39 37
case2 :set value的時候使用loc 、iloc:
import pandas as pd
import numpy as np
values = np.arange(40).reshape(10,4)
dates = pd.date_range('2022-01-01',periods=10)
df = pd.DataFrame(values,index=dates,columns=list('ABCD'))
df.loc[:,['B','A']]=df[['A','B']]
#輸出結果與df無二樣,按理來說 A B之間互換value才對。
df.loc[:,['A','C']]=df[['B','A']]
#輸出:# C列值被NAN直接overwritten了,意思是在賦值操作右邊沒有給我們的C列提供值進行set value ,A列 也不是B列的value,保持remain。
A B C D
2022-01-01 0.0 1.0 NaN 3.0
2022-01-02 4.0 5.0 NaN 7.0
2022-01-03 8.0 9.0 NaN 11.0
2022-01-04 12.0 13.0 NaN 15.0
2022-01-05 16.0 17.0 NaN 19.0
2022-01-06 20.0 21.0 NaN 23.0
2022-01-07 24.0 25.0 NaN 27.0
2022-01-08 28.0 29.0 NaN 31.0
2022-01-09 32.0 33.0 NaN 35.0
2022-01-10 36.0 37.0 NaN 39.0
df.loc[:,['A','C']]=df[['B','A']].to_numpy() #使用原始值,而且copy 或者view 映射的value
#輸出: 完成 B列 替換A列,A列替換C列
A B C D
2022-01-01 1 1 0 3
2022-01-02 5 5 4 7
2022-01-03 9 9 8 11
2022-01-04 13 13 12 15
2022-01-05 17 17 16 19
2022-01-06 21 21 20 23
2022-01-07 25 25 24 27
2022-01-08 29 29 28 31
2022-01-09 33 33 32 35
2022-01-10 37 37 36 39
結論
在pandas使用loc、iloc進行set value的時候,會先進行賦值兩邊所有軸的對齊,在上述中 C列最后為NAN,是因為在賦值 沒有找到對應的C列,這樣導致的結果是 使用iloc 或者loc賦值不會改變原始DataFrame 或者series ;
