Pandas 1.4.3与1.4.4+版本insert()方法排序保存差异问题
问题:Pandas高版本insert()方法无法保留排序状态?
我创建了分别按升序和降序排序的数据集,使用insert()方法插入到DataFrame后,发现Pandas 1.4.3版本能正常保留排序结果,但1.4.4及以上版本无法保留排序状态。期望高版本也能得到排序后的数据,请问问题出在哪里?
1.4.4版本输出
| Sorted Ascending | Sorted Descending | |
|---|---|---|
| 36 | 1 | 1 |
| 35 | 2 | 2 |
| 34 | 3 | 3 |
| 33 | 4 | 4 |
| 32 | 5 | 5 |
| 31 | 6 | 6 |
| 30 | 7 | 7 |
| 29 | 8 | 8 |
| 28 | 9 | 9 |
| 27 | 10 | 10 |
1.4.3版本输出
| Sorted Ascending | Sorted Descending | |
|---|---|---|
| 36 | 1 | 99 |
| 35 | 2 | 98 |
| 34 | 3 | 95 |
| 33 | 4 | 94 |
| 32 | 5 | 93 |
| 31 | 6 | 92 |
| 30 | 7 | 91 |
| 29 | 8 | 90 |
| 28 | 9 | 90 |
| 27 | 10 | 89 |
测试代码
import pandas as pd import matplotlib.pyplot as plt data = [23, 45, 12, 67, 89, 34, 56, 78, 90, 11, 43, 21, 76, 88, 33, 55, 77, 99, 22, 44, 66, 87, 32, 54, 98, 65, 87, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 13, 23, 34, 45, 56, 67, 78, 89, 90, 91, 92, 93, 94, 95] df = pd.DataFrame() data_series = pd.Series(data, name='Data') sorted_ascending = data_series.sort_values(ascending=True) sorted_descending = data_series.sort_values(ascending=False) df_sorted_ascending = pd.DataFrame(sorted_ascending) df_sorted_descending = pd.DataFrame(sorted_descending) df.insert(0, 'Sorted Ascending', df_sorted_ascending) df.insert(1, 'Sorted Descending', df_sorted_descending) plt.figure(figsize=(10, 6)) df.plot(kind='line') plt.xlabel('Index') plt.ylabel('Values') plt.title('Sorted Data Plot') plt.grid(True) plt.show()
问题原因
Pandas 1.4.4及以上版本修改了insert()方法的行为:当插入带有索引的DataFrame/Series时,会严格按照索引对齐规则插入数据;而1.4.3版本则是直接按数据的顺序追加,忽略索引匹配。
你的代码中,sort_values()默认不会重置索引,所以sorted_ascending和sorted_descending都保留了原数据的索引。插入第一个列后,空DataFrame继承了该列的索引;插入第二个列时,高版本会根据已有的索引去匹配df_sorted_descending中对应索引位置的值,而非按排序后的顺序插入,最终导致两列数值一致。
解决办法
方法1:排序后重置索引
在排序时添加reset_index(drop=True),丢弃原索引,让数据按排序后的顺序生成新索引:
sorted_ascending = data_series.sort_values(ascending=True).reset_index(drop=True) sorted_descending = data_series.sort_values(ascending=False).reset_index(drop=True)
方法2:直接用数值数组构造DataFrame
跳过insert(),直接用排序后的数值数组构造DataFrame,完全忽略索引影响:
df = pd.DataFrame({ 'Sorted Ascending': sorted_ascending.values, 'Sorted Descending': sorted_descending.values })
内容的提问来源于stack exchange,提问作者V1RAGE
相关产品推荐
相关产品推荐

