如何在Python中将DataFrame的两列转换为OrderedDict?
保持原始顺序遍历日期键值对的解决方案
你的问题核心是普通字典无法保留原始行顺序,而你之前用set_index后转字典的方式,会按索引排序而非原始行顺序输出。以下是几种可行的解决方法:
方法一:直接遍历DataFrame行(最可靠)
无需将数据转为字典,直接遍历DataFrame的原始行,完全保留数据输入顺序:
import pandas as pd data = [ ("2022-12-15", "2022-12-18"), ("2022-12-19", "2022-12-21"), ("2022-12-22", "2022-12-24"), ("2022-12-26", "2022-12-27"), ("2022-12-29", "2022-12-30"), ("2022-12-02", "2022-12-04"), ("2022-12-06", "2022-12-07"), ("2022-12-07", "2022-12-08"), ("2022-12-13", "2022-12-14"), ("2023-01-01", "2023-01-03"), ] df = spark.createDataFrame(data).toDF(*('startDate', 'endDate')).toPandas() # 遍历原始行,保持输入顺序 for _, row in df.iterrows(): print(f'startDate is {row["startDate"]} and corresponding endDate is {row["endDate"]}.')
方法二:使用OrderedDict构建有序字典
如果你确实需要字典结构,可以用collections.OrderedDict来强制保留插入顺序:
from collections import OrderedDict import pandas as pd data = [ ("2022-12-15", "2022-12-18"), ("2022-12-19", "2022-12-21"), ("2022-12-22", "2022-12-24"), ("2022-12-26", "2022-12-27"), ("2022-12-29", "2022-12-30"), ("2022-12-02", "2022-12-04"), ("2022-12-06", "2022-12-07"), ("2022-12-07", "2022-12-08"), ("2022-12-13", "2022-12-14"), ("2023-01-01", "2023-01-03"), ] df = spark.createDataFrame(data).toDF(*('startDate', 'endDate')).toPandas() # 按原始行顺序构建OrderedDict ordered_dict = OrderedDict(zip(df['startDate'], df['endDate'])) for k, v in ordered_dict.items(): print(f'startDate is {k} and corresponding endDate is {v}.')
方法三:利用Python 3.7+的字典插入有序特性
Python 3.7及以上版本的普通字典默认保留插入顺序,直接通过zip按原始行顺序构建字典即可:
import pandas as pd data = [ ("2022-12-15", "2022-12-18"), ("2022-12-19", "2022-12-21"), ("2022-12-22", "2022-12-24"), ("2022-12-26", "2022-12-27"), ("2022-12-29", "2022-12-30"), ("2022-12-02", "2022-12-04"), ("2022-12-06", "2022-12-07"), ("2022-12-07", "2022-12-08"), ("2022-12-13", "2022-12-14"), ("2023-01-01", "2023-01-03"), ] df = spark.createDataFrame(data).toDF(*('startDate', 'endDate')).toPandas() # Python3.7+ 字典自动保留插入顺序 dictTest = dict(zip(df['startDate'], df['endDate'])) for k, v in dictTest.items(): print(f'startDate is {k} and corresponding endDate is {v}.')
为什么原代码会丢失顺序?
你之前用df.set_index('startDate')['endDate'].to_dict()时,set_index会将startDate设为索引,pandas转换字典时会按索引的排序顺序输出,而非原始数据的行顺序,因此导致顺序混乱。
内容的提问来源于stack exchange,提问作者Guoran Yun
相关产品推荐
相关产品推荐

