Добавить с помощью dataframe.to_csv () с сохранением порядка столбцов - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь использовать 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

Я хотел бы используйте эту функцию в течение длительного периода времени, поэтому я хотел бы избежать взломов и по возможности иметь более чистое / надежное решение

Если у вас есть идея, которую мы будем очень признательны, спасибо!

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы можете найти порядок ключей, которые вы хотите записать в файле csv, на основе первого dict:

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)

То же самое можно сделать в al oop для всех dicts, которые у вас есть. Это гарантирует, что порядок столбцов останется таким же для слов, которые вы пишете в CSV.

0 голосов
/ 05 мая 2020

Решение от @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()))

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...