You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas反转DataFrame出现异常结果问题求助

Pandas两次反转后数据丢失的问题解决

问题描述

假设有如下DataFrame:

value
2023-02-01     a
2023-02-02     b
2023-02-03     c
2023-02-04     d

执行两次反转操作后,无法得到完整的原DataFrame:

复现代码

import pandas as pd
df = pd.DataFrame(
    {"value": {0: "a", 1: "b", 2: "c", 3: "d"}}
)
df.index = pd.date_range(start='2023-02-01', periods=4,freq='D')
new  = df.loc[::-1] #第一次反转
new2 = new.loc[::-1] #再次反转回原顺序
print(new2)

实际输出

2023-02-04     d

预期输出

value
2023-02-01     a
2023-02-02     b
2023-02-03     c
2023-02-04     d

版本信息

Pandas 1.3.5
Python 3.9

问题原因

在Pandas 1.3.5版本中,loc[::-1]是基于索引标签的切片操作。第一次反转后,DataFrame的索引变为倒序的日期:2023-02-04、2023-02-03、2023-02-02、2023-02-01。此时再次使用loc[::-1],Pandas会尝试从最后一个标签(2023-02-01)开始,以步长-1向前切片,但由于日期索引本身是升序逻辑,这种切片只会匹配到第一个符合反向逻辑的标签(2023-02-04),最终只返回一行数据。

解决方法

方法1:使用iloc基于位置反转

iloc是基于行位置的索引,不受标签影响,直接按位置反转即可:

import pandas as pd
df = pd.DataFrame(
    {"value": {0: "a", 1: "b", 2: "c", 3: "d"}}
)
df.index = pd.date_range(start='2023-02-01', periods=4,freq='D')
new = df.iloc[::-1] # 按位置反转
new2 = new.iloc[::-1] # 再次按位置反转回原顺序
print(new2)

方法2:反转后重置索引,再恢复

第一次反转后重置索引,消除原日期标签的影响,反转后再恢复原索引:

import pandas as pd
df = pd.DataFrame(
    {"value": {0: "a", 1: "b", 2: "c", 3: "d"}}
)
df.index = pd.date_range(start='2023-02-01', periods=4,freq='D')
new = df.loc[::-1].reset_index() # 重置索引,保留原索引为列
new2 = new.loc[::-1].set_index('index') # 反转后恢复原索引
print(new2)

方法3:用sort_index直接恢复原顺序

第一次反转后,直接对索引升序排序即可回到原顺序,无需再次反转:

import pandas as pd
df = pd.DataFrame(
    {"value": {0: "a", 1: "b", 2: "c", 3: "d"}}
)
df.index = pd.date_range(start='2023-02-01', periods=4,freq='D')
new = df.loc[::-1] # 反转
new2 = new.sort_index() # 按索引升序排序,回到原顺序
print(new2)

以上三种方法均能输出预期的完整原DataFrame。

内容的提问来源于stack exchange,提问作者Bhargav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:40:24