Как объединить каждые два CSV-файла из одной папки в один CSV-файл каждый?

#python #database #pandas #dataframe #concatenation

#python #База данных #pandas #dataframe #объединение

Вопрос:

У меня есть папка с файлами в формате p1_1001.csv, p1_1002csv, p2_1001.csv, p2_1002.csv …

Это данные части 1 и части 2 для одного кандидата 1001,1002 …

Я хочу объединить p1 и p2 для каждого кандидата. То есть сгенерируйте один файл CSV для каждого кандидата .. 1001,1002,1003 .. из той папки, где хранятся данные для обеих частей. Итак, первая часть — это номера следов от 1-49, а вторая часть — от 50 до 99.Я хочу объединить PI с p2 без заголовков p2.So получение одного файла CSV для участника 1001 из пробной версии 1 в 100 в одной папке

Я пробовал работать с glob, но я не могу заставить его работать. Может ли кто-нибудь помочь мне с этим?

Комментарии:

1. Как далеко вы продвинулись? Можете ли вы поделиться кодом на сегодняшний день и где вы застряли?

2. Как вы генерируете «единый CSV для каждого кандидата»? Это просто путем объединения содержимого CSV? Имеет ли значение содержимое csv? например, если оба p1_1001.csv и p2_1001.csv содержат заголовок, должен ли конечный 1001.csv содержать не более одного заголовка?

3. Итак, первая часть — это номера следов от 1-49, а вторая часть — от 50 до 99. Я хочу объединить PI с p2 без заголовков p2.So получение одного файла CSV для участника 1001 из пробной версии с 1 по 100 в одной папке.@ АдитьяСантосо

Ответ №1:

Я пробовал это с помощью glob, и это должно работать нормально.

 import pandas as pd
import glob

_candidates = ['1001', '1002'] # All candidates
_candidate_files = [(candidate, glob.glob('./*{}.csv'.format(candidate))) for candidate in _candidates]

for candidate in _candidate_files:
    df = []
    for file in candidate[1]:
        file_df = pd.read_csv(file)
        df.append(file_df)
    df = pd.concat(df, axis=0)
    df.to_csv(candidate[0]   '.csv')
  

Для всех кандидатов, для которых вы хотите получить окончательный df, заполните список. Это исходное предположение, что p1 и p2 имеют выровненные столбцы.

Ответ №2:

Некоторые идеи здесь:

 from os import listdir
from os.path import isfile, join

# step 1: list all csv in that directory
mypath = './foo/bar' # this should point to the directory where the csv resides
csvs = [f for f in listdir(mypath) if ('csv' in f and  isfile(join(mypath, f)))]    

# step 2: group CSVs that belong to one candidate
groups = {}
for c in csvs:
    (pNum, candidate) = c.split('_')
    if candidate not in groups:
        groups[candidate] = []
    groups[candidate].append(c)


# step 3: read contents for each group, append to one file
for candidate in groups:
    files = groups[candidate]        
    for f in files:
        with open(join(mypath, f) , 'r') as file:
            data = file.read()

        with open(candidate, 'a ') as outFile:                                
            outFile.write(data)
            # if you need to append newline at the end of every segment:
            outFile.write('n')                

  

добавление: если использование pandas не является проблемой, я настоятельно рекомендую рассмотреть pandas.read_csv относительно безболезненный и беспроблемный способ обработки csv. Если вы работаете внутри pandas DataFrame , вы также можете сделать pd.concat([df1, df2]) (docs here) логически объединить содержимое CSV