Я хочу итеративно добавлять панды 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')