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 ;


__EOF__

本文作者ivan09
本文链接https://www.cnblogs.com/ivan09/p/15759410.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   烦恼1234  阅读(1525)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示