我有一个数据框架,结构如下:
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
因此,当我这样做时,我可以看到范围被正确排序(但尚未在数据框中替换):
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
但是当我尝试将这个范围分配给原始数据帧时,它不会改变:
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
有什么想法我错了或应该尝试吗?
让我们假设我们有如下数据,并且我们希望仅按10月份的position
行进行排序(基本上我们希望交换第4行和第5行):
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:15:00 25306 418 MAW
5 2015-10-25 02:00:00 25305 420 MAW
6 2015-10-25 02:30:00 25307 415 MAW
7 2015-10-25 02:45:00 25308 415 MAW
选择十月和你应用的其他过滤器(基本上使用你在这里的逻辑):
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)].index.values
subset_index
是array([4, 5, 6, 7])
-这些是我们要排序的行。
在提取了要排序的索引值之后,您有两个选项:
选项1:保留索引并按正确顺序重新赋值(右索引)。
按正确顺序赋值(numpy数组)给数据帧子集:
data.loc[subset_index] = data.loc[subset_index].sort_values("position").values
结果
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月份的行被position
排序,9月份的第0行和第1行未排序。
选项2:按正确的顺序排序索引,并重新索引数据框。
为这个子集
创建一个新的排序索引顺序reordered_subset_index = data.loc[subset_index].sort_values("position").index.values
reordered_subset_index
是array([5, 4, 6, 7])
。现在我们需要为整个数据框架创建一个正确的索引顺序:
new_index = data.index.values
new_index[subset_index] = new_index[reordered_subset_index]
new_index
是array([0, 1, 2, 3, 5, 4, 6, 7])
。这个索引定义了初始数据框中行的正确顺序。
现在我们可以重新索引我们的数据框架并按照新的索引进行排序:
data.reindex(new_index).sort_index()
结果与选项1相同。