如何将Pandas读取CSV的DataFrame转为带索引的OrderedDict并解决输出问题
解决方案
1. 实现带行号的输出效果
你用df.iterrows()遍历的时候,返回的第一个变量i就是当前行的索引(默认从0开始计数),只需要修改打印语句,在输出前拼接i+1即可实现从1开始的序号效果。
修改后的循环代码如下:
for i, row in df.iterrows(): d = OrderedDict(zip(row.index.tolist(), row.tolist())) print(f"{i+1}. {d}")
2. zip()与tolist()的作用说明
tolist():是pandas对象的内置方法,作用是将pandas的Index、Series等专属数据结构转换为Python原生的列表类型:row.index.tolist()会把当前行的列名索引转为列名字符串列表,例如['First Name', 'Last Name', 'Occupation', 'Age', 'Number']row.tolist()会把当前行的Series数据转为对应值的列表,例如第一行对应['Kate', 'Rose', 'Teacher', 24, 87]
zip():是Python内置函数,接收多个可迭代对象作为参数,会将不同可迭代对象中相同位置的元素配对为元组,最终返回由这些元组组成的迭代器。这里刚好把列名列表和行值列表按位置配对,生成的键值对元组可以直接传入OrderedDict生成有序字典。
3. 修复调整后仅输出最后一行的问题
你的代码问题是print(d)的缩进错误,放在了for循环的外部:循环过程中每次都会用新行的内容覆盖变量d,直到循环结束后才打印,最终只会输出最后一行的结果。
只需要将print(d)缩进一层,放到for循环的代码块内即可,带行号的修改后代码如下:
import pandas as pd from collections import OrderedDict df = pd.read_csv('for_testing.csv') def main(): choice = input("type sth ") if choice == '1': for i, row in df.iterrows(): d = OrderedDict(zip(row.index.tolist(), row.tolist())) print(f"{i+1}. {d}") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者PypypieYum
相关产品推荐
相关产品推荐

