#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