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