【问题标题】:Append using dataframe.to_csv() while conserving column order在保留列顺序的同时使用 dataframe.to_csv() 追加
【发布时间】:2025-11-21 22:05:03
【问题描述】:

我正在尝试使用 df.to_csv() 将数据附加到 csv。我想使用一个优雅的代码来使用它,但是会出现问题。有时,我碰巧得到带有不同顺序键的字典

import pandas as pd

# Simplified version of my function
def save_to_csv(dictionary, index):
    df = pd.DataFrame(dictionary, index=[index])
    header = index == 0
    df.to_csv('test.csv', mode='a', header=header)

# I run some function, I get dict 'dict' => I want to save it into csv file
id = 0
dict = {'col_name_1': 1, 'col_name_2': 2, 'col_name_3': 3}
save_to_csv(dict, id)

# I run some function a second time, I get dict 'dict' => I want to append it into csv file
id = 1
dict = {'col_name_2': 2, 'col_name_3': 3, 'col_name_1': 1}
save_to_csv(dict, id)

# etc ...

我明白了

,col_name_1,col_name_2,col_name_3
0,1,2,3
1,2,3,1

代替

,col_name_1,col_name_2,col_name_3
0,1,2,3
1,1,2,3

我想长时间使用此功能,因此我想避免黑客攻击并尽可能提供更多干净/强大的解决方案

如果您有任何想法,将不胜感激,谢谢!

【问题讨论】:

  • 恕我直言,唯一的防弹方法是将列作为列表传递:cols = ['col_name_1', 'col_name_2', 'col_name_3'],然后是 save_to_csv(dict, id, cols),最后是 df = pd.DataFrame(dictionary, index=[index], columns=cols)。或者,您可以对列名进行排序:df = pd.DataFrame(dictionary, index=[index], columns=sorted(dictionary.keys())).

标签: python pandas file csv dictionary


【解决方案1】:

@Serge Ballesta 的解决方案,我将用于此项目

def save_to_csv(dictionary, index):
    df = pd.DataFrame(dictionary, index=[index])
    header = index == 0
    df.to_csv('test.csv', mode='a', header=header, columns=sorted(dictionary.keys()))

谢谢!

【讨论】:

    【解决方案2】:

    您可以根据第一个dict在csv文件中找到要写入的键的顺序:

    dict = {'col_name_1': 1, 'col_name_2': 2, 'col_name_3': 3} 
    key_list = [key for key in dict.keys()]
    
    save_to_csv(dict, id)
    

    现在,您可以根据key_list 对其他字典键进行排序并保存到 csv 文件:

    dict2 = {'col_name_2': 2, 'col_name_3': 3, 'col_name_1': 1}
    d = {}
    In [1735]: for k in key_list: 
          ...:     if k in dict2: 
          ...:         d[k] = dict2[k] 
          ...:                         
    
    In [1736]: d                                                                                                                                                                                                
    Out[1736]: {'col_name_1': 1, 'col_name_2': 2, 'col_name_3': 3}
    
    save_to_csv(d, id)
    

    您拥有的所有 dicts 都可以在循环中完成相同的操作。这将确保您在 CSV 中编写的 dicts 的列顺序保持不变。

    【讨论】:

    • 我喜欢你的回答,但是由于我可能不会在同一次执行中运行不同的追加,我不能只将键保存到变量中。我想我会选择“cols=sorted(dictionary.keys())”,因为该列可能不会因特定实验而改变,但我不想硬编码,以防我做其他实验
    • 基本上你需要第一个字典键的排序列表。这就是重点。如果适合你的情况,你也可以用你的方法来做。如果答案有帮助,请考虑投票。
    • 是的,刚刚明白了,我认为内置的 .to_csv 会直接匹配列非常感谢您的时间:)
    • 当然,很高兴为您提供帮助。