• 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 ;

  • 相关阅读:
    html5画饼形图
    jqGrid添加详细按钮,单击弹出窗体
    Groovy的MOP和元编程学习笔记(超级牛逼的功能)
    使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等,以及方法执行的坑或者模拟不成功解决
    mysql 索引无法使用问题
    float/double 浮点数据*100精度丢失问题
    使用Groovy的sql模块操作mysql进行多种查询
    groovy与java中的多方法
    fastdfs+nginx集群高可用搭建的一些坑!!记录一下
    keepalived vrrp_script脚本不执行解决办法
  • 原文地址:https://www.cnblogs.com/ivan09/p/15759410.html
Copyright © 2020-2023  润新知