#python #excel #pandas #jupyter-notebook #txt
#python #excel #pandas #jupyter-записная книжка #txt
Вопрос:
Ссылка на пример текстового файла Дополнительная ссылка на файл
Я хочу иметь возможность использовать python для чтения текстового файла и выбора информации о столбцах и строках. Текстовый текст в файле находится в одном столбце с данными для столбца, расположенного дальше по файлу, как в примере ниже. Я добавил некоторую дополнительную информацию в (). У меня есть несколько разных текстовых файлов с аналогичным форматированием, и поэтому я хотел бы иметь возможность просто заменить каждый файл и запустить их.
Моя цель — иметь возможность помещать данные в файл csv или Excel.
Вот ссылка на текстовый файл. Примерно на 1/3 вниз вы увидите в (), где находятся имена столбцов, а прямо под ними я отметил, где находятся данные для этих столбцов. Ниже по списку есть дополнительные данные, но мне просто нужно хорошо начать. У меня есть несколько похожих текстовых файлов, которые мне понадобятся для запуска кода.
Комментарии:
1. изображения бесполезны. Пожалуйста, предоставьте образец ввода и вывода в виде выделенного текста
2. Привет, Роб, я обновил дополнительную информацию и ссылку на текстовый файл. Спасибо
Ответ №1:
Выполнение ETL на том, что является почти интерфейсом данных свободного формата, всегда является уродливым и нестабильным подходом
- рассматривайте определения столбцов как метаданные
- найдите метаданные, получите начальную и конечную строки этого
- очистите метаданные — есть определения столбцов, которые не существуют !
- теперь есть имена столбцов
- считайте, что остальные строки после последней строки метаданных являются фактическими данными
reshape()
это в массив, содержащий X максимально возможных строк в оставшихся данных- выполните логику проверки после преобразования для фильтрации по тому, что кажется интересным набором данных
import pandas as pd
with open("data1.txt") as f:
data = f.read()
# pd.read_csv(io.StringIO(data))
dfraw = pd.DataFrame(data.split("n"))
# find first and last row that contain column meta information
colsi = dfraw.loc[dfraw[0].str.contains("Column")].index
assert len(colsi)==2, "failed to find column labels"
# first stab... based on finding meta information
cols = dfraw.loc[colsi[0]:colsi[1]]
# exclude meta rows that are empty or labeled "Grade"
cols = cols[(cols[0]!="") amp; (cols[0]!="Grade") amp; (cols[0]!="(Column Names)--------------------")]
# shift dfraw start row to start of data after column meta data
dfraw = dfraw.loc[colsi[1] 1:].reset_index(drop=True)
# create dataframe with all remaining rows, truncating so reshape does not fail
# using numpy reshape() to transform sets of rows into columns
df = pd.DataFrame(dfraw.loc[:(len(dfraw)-(len(dfraw)%len(cols)))-1].values.reshape(int(len(dfraw)/len(cols)), len(cols)),
columns=cols[0].values)
# filter to valid "Egg #" and Day0 is defined
df = df[(df["Egg #"].str.match("^[0-9] [ ] [A-Z][0-9]")) amp; (df["Day0"].str.strip()!="")]
print(df.to_string(index=False))
вывод
Egg # Day0 Maturity IVF/ICSI Day1 Day2 Grade Day 3 Grade- Frag% Day4 Day5 Day6 Day7 Comment Fate Freezing ID (End of Column names)-------------------------
1 A1 (egg #)------------ MII ICSI 2PN/2PB (Day 1)---------- 2BC (Day 2 grade)-------- 6BC (Day 3)----------- 15 (Grade- Frag%)-------- - (Day 4) -------- - (Day 5) -------- - (Day 6) -------- - (Day 7) -------- (Comments) ------- F (Fate) A102519-01EV (Freezing ID)-------------
2 A2 MII ICSI 2PN/2PB 5B 12B 10 - - - - F B102519-01EV
3 A3 MII ICSI 2PN/2PB 5B 8B 10 - - - - ET
4 A4 MII ICSI 2PN/2PB 5B 10A 0 - - - - ET
5 B1 MII ICSI 2PN/2PB 5BC 8BC 10 - - - - F A102519-01EV
6 B2 MI MII/ICSI 2PN/2PB SAME - SAME - - - D
Комментарии:
1. Большое тебе спасибо, Роб. Я смог заставить его работать отлично, просто нужно было указать кодек, который будет использоваться для файла. Я определенно ценю вашу помощь. В будущем у меня могут возникнуть другие вопросы относительно этих наборов данных.
2. @NickBowman добро пожаловать. Можете ли вы принять ответ — рады предоставить идеи / подходы, если у вас возникнут дополнительные вопросы
3. пара вопросов: в загруженном мной документе txt я добавил элементы (имена столбцов) и метки для данных для этих столбцов. Есть ли способ найти эти элементы, не обращаясь к добавленным меткам? Я работаю с довольно большим количеством документов txt, которые имеют одинаковое форматирование, и мне бы хотелось просто иметь возможность запускать код на них без необходимости вносить в них изменения. Я безуспешно пытался отредактировать ваш код. Я также хотел бы иметь возможность экспортировать готовый набор данных в тот же Excel, что и другие наборы данных, после их запуска. Возможно ли это?
4. подход заключается в поиске строк, которые являются именами столбцов. эту строку
colsi = dfraw.loc[dfraw[0].str.contains("Column")].index
необходимо изменить, чтобы найти строки, которые являются именами столбцов. Возможно, ищите первое вхождение «Egg #» и первое вхождение «Идентификатор замораживания». Существует несколько способов изменения рабочих книг Excel с помощью python / pandas. Я этого не делаю, поскольку я не пользователь Windows и у меня нет Excel…5. Привет, @Rob Raymond — извините, что возвращаюсь к этому, поскольку я немного углубляюсь в ваш код, у меня возникли некоторые трудности с добавлением нескольких вещей. Я смог очень легко экспортировать его в csv. Проблема, с которой я сталкиваюсь, связана с этой строкой (colsi = dfraw.loc[dfraw[0].str.contains(«Столбец»)].index) Кажется, я не могу заставить код работать для начала df в Egg # и заканчиваться на идентификаторе замораживания. Есть ли также способ добавить дополнительные столбцы из нескольких элементов, которые разделены символом (:) в текстовом файле? Если да, то куда пойдут эти строки кода? Я хотел бы добавить их информацию в конце