Как мы можем добавить или объединить несколько файлов с в основном похожими схемами, но не со всеми?

Я пытаюсь объединить несколько текстовых файлов с разделителями табуляции в один файл и сохранить его в формате 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 будет работать в качестве альтернативы. Есть ли предпочтительный способ сделать это? Спасибо!!

Есть ли какие-либо ошибки или нежелательные результаты при попытке кода? pd.concat не требует одинаковых столбцов.

Parfait 13.12.2020 03:36

Я только что обновил свой оригинальный пост. Итак, если имена полей совпадают, он добавляет новые записи к предыдущим записям? Если новые имена, которые не совпадают, просто добавляются, а совпадающие данные добавляются ниже?

ASH 13.12.2020 04:18

Все строки добавляются с concat. Если имена столбцов не совпадают, для этих строк заполняется NaN. Вы пытаетесь вертикально складывать (т. е. добавлять) или горизонтально соединять (т. е. объединять)? concat можно и то, и другое.

Parfait 13.12.2020 04:31

Извините, что не выразился здесь более ясно. Допустим, файл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.

ASH 13.12.2020 04:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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")

Другие вопросы по теме