首页 > 其他分享 >dataframe局部赋值

dataframe局部赋值

时间:2023-04-11 09:56:42浏览次数:38  
标签:tmp loc 局部 dataframe second dfmi value 100 赋值

背景

问题描述

如下图所示:(A)上图表示某仪器随开关开闭前后的变化曲线;(B)下图表示开关闭状态。现在的需求有三个:

  • 不考虑开关状态下超过指定阈值时的监测值统计特征
  • 开关打开状态(B=1,粉色区域)下超过指定阈值的监测值值局部信息统计
  • 开关闭合(B=0,空白区域)状态下超过指定阈值的监测值值局部信息统计

直观上看,(2)和(3)的结果统计结果应该存在明显的差异。但实际实现过程中,得到的结果却是完全一致。甚是烦恼,通过定位,发生了一个神奇的代码,如下:

temp_data[temp_data['time'].between(tmp_start_time, tmp_end_time)][
                'sig'] = tmp_value - 1
    
"""
temp_data:为我们的仪器检测值
start_time:开始时间
end_time:表示结束时间
tmp_value:为我们关注的一种状态
这里tmp_value-1的目的是基于检测值以更显眼的方式区分目标状态
"""

看上去没啥问题,就是一个简单的datafram赋值语句,接下来让我们通过模拟数据进行问题定位。

问题定位

a=pd.DataFrame({'a':range(10),'b':range(2,12)})
#备份一份a
b=a.copy()
a[a['a'].between(2,6)]['b']=100
#比较赋值前后a的变换
np.allclose(a.values,b.values)#True

赋值前后,dataframe a居然完全一样。

pandas官方解释

链接

示例:

访问

dfmi = pd.DataFrame([list('abcd'),
                     list('efgh'),
                     list('ijkl'),
                     list('mnop')],
                    columns=pd.MultiIndex.from_product([['one', 'two'],
                                                        ['first', 'second']]))


dfmi
Out[357]: 
    one          two       
  first second first second
0     a      b     c      d
1     e      f     g      h
2     i      j     k      l
3     m      n     o      p


# 第一种访问方式
dfmi['one']['second']
"""
0    b
1    f
2    j
3    n
Name: second, dtype: object
"""



#第二种访问方式
dfmi.loc[:, ('one', 'second')]
"""
0    b
1    f
2    j
3    n
Name: (one, second), dtype: object
"""

这些都产生相同的结果,那么你应该使用哪个?了解这些操作的顺序以及为什么方法 2 ( .loc) 比方法 1 (chained []) 更受青睐是很有启发性的。

dfmi['one']选择列的第一级并返回单索引的 DataFrame。然后另一个 Python 操作dfmi_with_one['second']选择由 索引的系列'second'。这由变量表示,dfmi_with_one因为 pandas 将这些操作视为单独的事件。例如,对 的单独调用__getitem__,因此必须将它们视为线性操作,它们一个接一个地发生。

相比之下df.loc[:,('one','second')],将嵌套元组传递(slice(None),('one','second'))给单个调用 __getitem__. 这使得 pandas 可以将其作为一个整体来处理。此外,这种操作顺序可以显着加快,并且如果需要,可以对**两个轴进行索引。

重新赋值

访问时两种方式只是性能问题,赋值时第二种方式回触发SettingWithCopy警告是,并且原始数据对象并未发生小改。

#第一种
dfmi.loc[:, ('one', 'second')] = 100
# becomes
dfmi.loc.__setitem__((slice(None), ('one', 'second')), 100)

"""
one	two
first	second	first	second
0	a	100	c	d
1	e	100	g	h
2	i	100	k	l
3	m	100	o	p

"""

#第二种:
dfmi['one']['second'] = 1000
# becomes
dfmi.__getitem__('one').__setitem__('second', 1000)
"""
C:\Users\B_Hanan\AppData\Local\Temp\ipykernel_4124\431561245.py:1: 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: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  dfmi['one']['second'] = 100
C:\Users\B_Hanan\AppData\Local\Temp\ipykernel_4124\431561245.py:3: 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: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  dfmi.__getitem__('one').__setitem__('second', 100)
  
  
one	two
first	second	first	second
0	a	100	c	d
1	e	100	g	h
2	i	100	k	l
3	m	100	o	p

"""

如何理解?

其实核心是当前数据对象是副本还是视图?在numpy中我们已经介绍了视图和副本的区别,从这里我们可以直接看出链式查询([]的方式)实际上返回的是副本(赋值不会改变原数据),而.loc返回的实际上是视图(view,会发生数据的更改)。

问题解决

所以针对上述问题,我们应该用loc进行赋值。

temp_data.loc[temp_data['time'].between(tmp_start_time, tmp_end_time),
                          'sig'] = tmp_value - 1

最终效果图:

  • 打开状态下存在超限情况
  • 关闭状态下无超限情况

标签:tmp,loc,局部,dataframe,second,dfmi,value,100,赋值
From: https://www.cnblogs.com/AzeHan/p/17305092.html

相关文章

  • m基于shepp-Logan模型和滤波反投影的医学图像多尺度全局重建和局部重建matlab仿真
    1.算法描述        从投影重建物体的截面图像是图像处理中非常重要的技术此技术在物体的无损伤性检测其内部缺陷的应用中能起很大作用从投影重建图像的技术早在20世纪中期就已经制成常规医疗诊断设备的商品1917年奥地利数学家J.Radon发表的论文证明了二维物体或三维物体......
  • shell 变量赋值
    shell变量赋值1.read进行赋值  read的脚本中示例语法[root@localhost~]#vimread-1.sh[root@localhost~]#catread-1.sh#!/bin/bashread-p"请输入一个值"Varecho"您输入的变量值为$Var"[root@localhost~]#shread-1.sh请输入一个值oldboy您输入的变量值为old......
  • 通过JS赋值日期框
      java代码JavascriptExecutorjs=(JavascriptExecutor)driver;js.executeScript("document.getElementById('beginDate').value='2020-05-10'"); ......
  • C, cython和pandas dataframe交互int64, int32的选择
    cython调用C代码的一个错误expected'int'butgot'long',原因不复杂,Ccode的int为32bit,而pandasdf缺省为np.int64(64bit),有个参数传递了数组,指针类型就不符了。两个解决方案C代码里面所有相关的int改为longlong类型或者使用pandasdataframe前转换为np.int32,即df.as......
  • 解构赋值(数组与对象都能解构赋值)
    ?就是左边有多个变量名对应赋值给右边的多个值数组的解构赋值还可以实现不用新建空变量名,完成相互换值操作可以给左边的变量名设置默认值,有则选对应,无则选默认值对象的解构赋值数组套对象的解构赋值多级对象解构拿里面对象的值(对象套对象)notice,拿数据的时候,可......
  • 如何理解信息隐藏和局部化
        信息隐藏即隐藏实现细节,只提供必要的接口,从而使用户可以使用系统功能,而无需了解细节性质的信息。汽车是生活中常用的交通工具,它的内部由很多零件组成,而人们使用汽车时并不需要了解这些零件是如何配合使汽车能在道路上行驶,只需要通过方向盘、油门等简单的接口来驾驶汽车......
  • 赋值Record之间的File column 文件。
     参数说明: rb_pleasant_ID目标实体的recordID entity需要赋值文件的接受实体;privatevoidcopyFileColumnPro(IOrganizationServiceservice,Entityentity,Guidrb_pleasant_ID){//DownloadfilevarinitializeFile=newInitializeF......
  • python中的全局变量、实例变量、局部变量、静态变量等
    a=1#全局变量,在模块内、在所有函数外面、在class外面classTest():c=3#静态变量,也可以说类属性,在class内的,但不在class的方法内的deflogin(self):b=2#局部变量,在函数内、在class的方法内(未加self修饰的)self.d=4#实例变量,也可以说实例属性,在class的......
  • jeesite 给绑定的控件赋值
    如果事件已绑定模型,即设置了path=’XXX‘,则给控件赋值是无效的,<divclass="col-sm-10"><#form:textareapath="remarks"rows="4"maxlength="500"class="form-control"/>......
  • Python __ Pandas __ Dataframe 实验课
    基于Dataframe实现以下功能:导入directory.csvimportnumpyasnpimportpandasaspdfdata=pd.read_csv('F:\\directory.csv')dfx=pd.DataFrame(fdata)starbucks=pd.DataFrame(fdata)显示数据集的基本信息print(fdata.head())print(fdata.info())print(fdata.describe(......