Объединение или объединение нескольких файлов CSV с разным количеством столбцов и присвоение столбца имени файла - PullRequest
0 голосов
/ 04 августа 2020

Привет, я новичок в python pandas, и я новичок в коде с использованием фрейма данных. Итак, я получил код от Inte rnet о том, как объединить два или более файла CSV в папке в один общий файл CSV. но я не могу получить ни одной строчки кода, я не знаю, как это сделать. Может ли кто-нибудь помочь мне в этом, пожалуйста.

import os, glob
import pandas as pd

path = "/home/user/data/"

all_files = glob.glob(os.path.join(path, "data_*.csv"))
df_merged   = pd.concat(df_from_each_file, ignore_index=True)
df_merged = (pd.read_csv(f, sep=',') for f in all_files)
df_merged.to_csv( "merged.csv")

Итак, здесь я пробовал все, но не могу получить df_from_each_file. Так может ли кто-нибудь помочь мне в этом, и я хочу, чтобы результат был таким

Итак, вот как мой результат должен выглядеть

1 Ответ

0 голосов
/ 04 августа 2020

РЕДАКТИРОВАТЬ №2: Фактические данные отличались от данных образца, и их нужно было объединить по горизонтали, а не по вертикали, передавая axis=1. Это создает повторяющиеся столбцы, поэтому фрейм данных необходимо транспонировать с помощью .T, чтобы удалить эти повторяющиеся столбцы как повторяющиеся строки с drop_duplicates(). Наконец, его нужно снова перенести обратно с помощью .T. Кроме того, нам пришлось исключить слушателей при чтении файлов, так как два файла имели одно и то же значение, поэтому они могли быть случайно отброшены. Вот почему нам пришлось читать заголовки столбцов как значения, а затем продвигать их обратно в заголовки в конце и отбрасывать первую строку с помощью .iloc.

pd.concat([pd.read_csv(f, header=None) for f in all_files], axis=1).T.drop_duplicates().T.to_csv('merged.csv', index=False)
df.columns = df.iloc[0]
df = df.iloc[1:]
df.to_csv('merged.csv', index=False)

РЕДАКТИРОВАТЬ №1: Как обсуждалось в LinkedIn, все ваши данные были в одном столбце, поэтому, чтобы читать их как несколько столбцов, вам нужно использовать sep='\s+', потому что есть несколько пробелов, разделяющих ваши данные, поэтому вы можете использовать \s+ в качестве разделителя или разделителя.

Для однострочника используйте .assign с file=os.path.basename(f)

pd.concat([pd.read_csv(f, sep='\s+').assign(file=os.path.basename(f)) for f in all_files]).to_csv('merged.csv', index=False)

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

import pandas as pd
import glob, os
path = 'Desktop'
all_files = glob.glob(os.path.join(path, "Book*.csv"))
pd.concat([pd.read_csv(f, sep='\s+').assign(file=os.path.basename(f)) for f in all_files]).to_csv('merged.csv', index=False)

Если файлы Excel уже разделены на столбцы, удалите sep='\s+' и используйте этот код:

pd.concat([pd.read_csv(f).assign(file=os.path.basename(f)) for f in all_files]).to_csv('merged.csv', index=False)

Book1.csv

col1    col2    col3    col4    col5
1       2       3       4       5

Book2.csv

col1    col2    col3    col4
2       3       4       5

merged.csv

col1    col2    col3    col4    col5    file
1       2       3       4       5       Book1.csv
2       3       4       5               Book2.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...