pandas 赋值操作 from loc 或者iloc
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 ;