Я пытаюсь объединить несколько текстовых файлов с разделителями табуляции в один файл и сохранить его в формате CSV. Некоторые схемы остались прежними, но поля в новых файлах не всегда существуют в старых файлах. Кроме того, я хочу добавить имя файла в последний столбец каждой строки.
Имена полей могут быть такими во всех файлах:
RIAD4097 RIAD4235 RIAD4239
В более новых файлах может быть это (они отсутствуют в старых файлах):
RIADJA28 RIADKW02
Вот код, который я тестирую, но получаю сообщение об ошибке.
import os, glob
import pandas as pd
path = "C:\\Users\\ryans\\OneDrive\\Desktop\\schemas\\"
all_files = glob.glob(os.path.join(path, "*.txt"))
all_df = []
for f in all_files:
df = pd.read_csv(f, delimiter='\t')
f['file'] = f.split('/')[-1]
all_df.append(df,f)
merged_df = pd.concat(all_df, ignore_index=True, sort=True)
df_merged.to_csv("C:\\Users\\ryans\\OneDrive\\Desktop\\merged.csv")
Эта строка выдает ошибку.
f['file'] = f.split('/')[-1]
Ошибка:
TypeError: объект 'str' не поддерживает назначение элементов
Я пытаюсь получить имя файла, указанное в самом последнем столбце, в каждой строке.
Основываясь на моем исследовании, я думаю, что метод append должен работать, и я думаю, что метод concat будет работать в качестве альтернативы. Есть ли предпочтительный способ сделать это? Спасибо!!
Я только что обновил свой оригинальный пост. Итак, если имена полей совпадают, он добавляет новые записи к предыдущим записям? Если новые имена, которые не совпадают, просто добавляются, а совпадающие данные добавляются ниже?
Все строки добавляются с concat
. Если имена столбцов не совпадают, для этих строк заполняется NaN
. Вы пытаетесь вертикально складывать (т. е. добавлять) или горизонтально соединять (т. е. объединять)? concat
можно и то, и другое.
Извините, что не выразился здесь более ясно. Допустим, файл1 имеет столбцы с именами A, B, C и D. Кроме того, файл2 имеет столбцы с именами A, B, C, D и E. Я хочу, чтобы A, B, C и D из файла2 были добавлены к файлу1, и столбец E из файла2, добавленный как новый столбец, и все строки из файла1 будут иметь NAN в столбце E, но данные из файла2 будут заполнены для столбца E. Я хочу захватить все данные из файлов, которые похожи , создайте один фрейм данных и поместите его в таблицу SQL Server.
Используйте os.path.basename(f)
, чтобы извлечь имя файла. И чтобы сохранить новый столбец, назначьте его []
, а не list.append
.
import os
...
all_df = []
for f in all_files:
df = pd.read_csv(f, delimiter='\t')
df['file'] = os.path.basename(f) # NEW COLUMN
all_df.append(df)
df_append = pd.concat(all_df, ignore_index=True, sort=True)
df_append.to_csv("C:\\Users\\ryans\\OneDrive\\Desktop\\merged.csv")
Еще лучше использовать понимание списка с assign
, чтобы добавить новый столбец:
all_df = [(pd.read_csv(f, delimiter='\t')
.assign(file=os.path.basename(f)) for f in all_files]
df_append = pd.concat(all_df, ignore_index=True, sort=True)
df_append.to_csv("C:\\Users\\ryans\\OneDrive\\Desktop\\merged.csv")
Есть ли какие-либо ошибки или нежелательные результаты при попытке кода?
pd.concat
не требует одинаковых столбцов.