当将索引范围分配给原始数据框时,使用iloc来替换数据框中的行范围不会被保存



我有一个数据框架,结构如下:

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_indexarray([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_indexarray([5, 4, 6, 7])。现在我们需要为整个数据框架创建一个正确的索引顺序:

new_index = data.index.values
new_index[subset_index] = new_index[reordered_subset_index]

new_indexarray([0, 1, 2, 3, 5, 4, 6, 7])。这个索引定义了初始数据框中行的正确顺序。

现在我们可以重新索引我们的数据框架并按照新的索引进行排序:

data.reindex(new_index).sort_index()

结果与选项1相同。

相关内容

  • 没有找到相关文章

最新更新