Добавить панды DataFrame в CSV с фиксированным заголовком - PullRequest
0 голосов
/ 03 ноября 2018

Я хочу итеративно добавлять панды DataFrames в CSV-файл. Обычно это не проблема. Однако DataFrames могут содержать не все столбцы. Поэтому простое добавление добавляет DataFrame к неправильным столбцам.

Я начинаю с

with open('test.csv', 'w') as output:
    writer = csv.writer(output, delimiter=',')
    writer.writerow(['a','b', 'c'])

Затем, например, я добавляю DataFrame df

    a   b   c
0   2   2.0 3
1   2   NaN 3

с помощью команды

df = pd.DataFrame([{'a':2, 'b':2, 'c':3}, {'a':2, 'c':3}])
df.to_csv('test.csv', index = False, header = False, mode = 'a') 

Однако следующий DataFrame, который я хочу добавить, может выглядеть как

    a   c
0   1   1
1   1   1

Когда я добавляю его снова, я не собираюсь писать заголовок, потому что он уже существует. Выполнение того же, что и раньше (как и ожидалось), не работает:

df =pd.DataFrame([{'a':1, 'c':1}, {'a':1, 'c':1}])
df.to_csv('test.csv', index = False, header = False, mode = 'a')

Это дает

    a   b   c
0   2   2.0 3.0
1   2   NaN 3.0
2   1   1.0 NaN
3   1   1.0 NaN

Конечно, я мог бы импортировать существующий csv в DataFrame, затем добавить и перезаписать старый файл:

file = pd.read_csv('test.csv')
df =pd.DataFrame([{'a':1, 'c':1}, {'a':1, 'c':1}])
file = file.append(df)
file.to_csv('test.csv', index = False, header = True)
pd.read_csv('test.csv')

Это именно то, что я хочу

    a   b   c
0   2   2.0 3
1   2   NaN 3
2   1   NaN 1
3   1   NaN 1

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

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

def append_to_csv(df, file):
    if not os.path.exists(file):
        pd.to_csv(file, index = False, header = True)
    else:
        with open(file) as f:
            header = next(csv.reader(f))
        columns = df.columns
        for column in set(header) - set(columns):
            df[column] = np.nan
        df.to_csv(file, index = False, header = False, mode = 'a')

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Просто для полноты картины я добавлю сюда функцию, используя ответ Mayank Porwal: Всякий раз, когда вы хотите добавить DataFrame к CSV с указанным заголовком. Если вы хотите разрешить новые столбцы (не содержащиеся в заголовке), вам нужно изменить функцию.

def append_to_csv(df, file):
    with open(file) as f:
        header = next(csv.reader(f))
    columns = df.columns
    for column in set(header) - set(columns):
        df[column] = ''
    df = df[header]
    df.to_csv(file, index = False, header = False, mode = 'a')
0 голосов
/ 03 ноября 2018

Вы всегда можете добавить пустой столбец к df следующим образом:

In [958]: df['b']=''

Затем реструктурируйте df как:

In [959]: df = df[['a','b','c']]

In [960]: df
Out[960]: 
   a b  c
0  1    1
1  1    1

Теперь запишите это в csv.

In [961]: df.to_csv('test.csv', index = False, header = False, mode = 'a')

Дайте мне знать, если это поможет.

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