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
相关产品推荐
相关产品推荐

