Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将索引范围指定给原始数据帧时,不会保存使用iloc替换数据帧中的行范围_Python_Pandas_Dataframe_Data Cleaning - Fatal编程技术网

Python 将索引范围指定给原始数据帧时,不会保存使用iloc替换数据帧中的行范围

Python 将索引范围指定给原始数据帧时,不会保存使用iloc替换数据帧中的行范围,python,pandas,dataframe,data-cleaning,Python,Pandas,Dataframe,Data Cleaning,我有一个具有以下结构的数据帧: date position quantity Unit 0 2015-01-01 00:00:00 1 720 MAW 根据我设定的条件,我希望根据“位置”列重新安排10月夏令时期间的日期(此处添加1小时)。因此,我对数据帧进行了子集划分,并获得了索引值: indexData = data[(data.date.dt.hour >= 2) & (data.date.dt.hour < 3) & (data.d

我有一个具有以下结构的数据帧:

date    position    quantity    Unit
0   2015-01-01 00:00:00 1   720 MAW
根据我设定的条件,我希望根据“位置”列重新安排10月夏令时期间的日期(此处添加1小时)。因此,我对数据帧进行了子集划分,并获得了索引值:

indexData = data[(data.date.dt.hour >= 2) & (data.date.dt.hour < 3) & (data.date.dt.day == 25) & (data.date.dt.month == 10) & (data.date.dt.year == 2015)].index
但当我尝试将此范围指定给原始数据drame时,它不会改变:

data.iloc[indexData[0]:(indexData[-1])+1] = data.iloc[indexData[0]:(indexData[-1])+1].sort_values("position")

# here I check the range if updated
data[(data.date.dt.hour >= 2) & (data.date.dt.hour < 3) & (data.date.dt.day == 25) & (data.date.dt.month == 10) & (data.date.dt.year == 2015)]

date    position    quantity    Unit
28520   2015-10-25 02:00:00 25309   410 MAW
28521   2015-10-25 02:00:00 25305   420 MAW
28522   2015-10-25 02:15:00 25310   407 MAW
28523   2015-10-25 02:15:00 25306   418 MAW
28524   2015-10-25 02:30:00 25307   415 MAW
28525   2015-10-25 02:30:00 25311   399 MAW
28526   2015-10-25 02:45:00 25308   415 MAW
28527   2015-10-25 02:45:00 25312   378 MAW
data.iloc[indexData[0]:(indexData[-1])+1]=data.iloc[indexData[0]:(indexData[-1])+1]。排序_值(“位置”)
#这里我检查范围是否更新
数据[(data.date.dt.hour>=2)&(data.date.dt.hour<3)&(data.date.dt.day==25)&(data.date.dt.month==10)&(data.date.dt.year==2015)]
日期位置数量单位
28520 2015-10-25 02:00:00 25309 410毫瓦
28521 2015-10-25 02:00:00 25305420毫安
28522015-10-2502:15:00 25310407毫瓦
28523 2015-10-2502:15:00 25306418 MAW
28524 2015-10-25 02:30:00 25307 415毫瓦
28525 2015-10-2502:30:00 25311399 MAW
28526 2015-10-2502:45:0025308415微瓦
28527 2015-10-25 02:45:00 25312378 MAW

你知道我哪里出了问题还是应该试试吗?

假设我们有如下数据,我们只想按10月份的
位置
行排序(基本上我们想交换第4行和第5行):

选择10月份时应用一些其他过滤器(基本上使用此处的逻辑):

subset_index=data[(data.date.dt.hour>=2)和(data.date.dt.hour<3)和(data.date.dt.day==25)和(data.date.dt.month==10)和(data.date.dt.year==2015)]索引值
子集索引
数组([4,5,6,7])
-这些是我们要排序的行

提取索引值进行排序后,您有两个选项:

选项1:保持索引并按正确顺序重新分配值(正确索引)

只需按正确的顺序将值(numpy数组)分配给数据帧子集:

data.loc[子集索引]=data.loc[子集索引].排序值(“位置”).值
结果是

date    position    quantity    Unit
0   2015-09-25 02:15:00 25310   407 MAW
1   2015-09-25 02:00:00 25309   410 MAW
2   2015-09-25 02:30:00 25311   399 MAW
3   2015-09-25 02:45:00 25312   378 MAW
4   2015-10-25 02:00:00 25305   420 MAW
5   2015-10-25 02:15:00 25306   418 MAW
6   2015-10-25 02:30:00 25307   415 MAW
7   2015-10-25 02:45:00 25308   415 MAW
如您所见,只有10月份的行按
位置进行了排序,9月份的行0和1未排序

选项2:按正确顺序对索引排序,并重新为数据帧编制索引

为此子集创建新的排序索引顺序

reordered_subset_index=data.loc[subset_index]。排序_值(“位置”).index.values
重新排序的子集索引是
数组([5,4,6,7])
。现在,我们需要为整个数据帧创建正确的索引顺序:

data.iloc[indexData[0]:(indexData[-1])+1].sort_values("position")

date    position    quantity    Unit
28521   2015-10-25 02:00:00 25305   420 MAW
28523   2015-10-25 02:15:00 25306   418 MAW
28524   2015-10-25 02:30:00 25307   415 MAW
28526   2015-10-25 02:45:00 25308   415 MAW
28520   2015-10-25 02:00:00 25309   410 MAW
28522   2015-10-25 02:15:00 25310   407 MAW
28525   2015-10-25 02:30:00 25311   399 MAW
28527   2015-10-25 02:45:00 25312   378 MAW
new_index=data.index.values
新索引[子集索引]=新索引[重新排序的子集索引]
新索引是
数组([0,1,2,3,5,4,6,7])
。该索引定义了初始数据帧中正确的行顺序

因此,现在我们可以重新编制数据帧的索引,并根据新索引对其进行排序:

data.reindex(新索引).sort\u索引()

结果与选项1中的结果相同。

熊猫对齐索引上的数据,因此,当您对数据帧的部分进行排序并将结果分配回时,熊猫强制已排序数据帧切片的索引与要将结果分配回的数据帧部分对齐。感谢您的评论。你认为我怎样才能避开这个问题?
date    position    quantity    Unit
0   2015-09-25 02:15:00 25310   407 MAW
1   2015-09-25 02:00:00 25309   410 MAW
2   2015-09-25 02:30:00 25311   399 MAW
3   2015-09-25 02:45:00 25312   378 MAW
4   2015-10-25 02:00:00 25305   420 MAW
5   2015-10-25 02:15:00 25306   418 MAW
6   2015-10-25 02:30:00 25307   415 MAW
7   2015-10-25 02:45:00 25308   415 MAW