python создание столбцов и строк из текстового файла без распознаваемых строк и столбцов

#python #excel #pandas #jupyter-notebook #txt

#python #excel #pandas #jupyter-записная книжка #txt

Вопрос:

Ссылка на пример текстового файла Дополнительная ссылка на файл

Я хочу иметь возможность использовать python для чтения текстового файла и выбора информации о столбцах и строках. Текстовый текст в файле находится в одном столбце с данными для столбца, расположенного дальше по файлу, как в примере ниже. Я добавил некоторую дополнительную информацию в (). У меня есть несколько разных текстовых файлов с аналогичным форматированием, и поэтому я хотел бы иметь возможность просто заменить каждый файл и запустить их.

Моя цель — иметь возможность помещать данные в файл csv или Excel.

Формат данных похож на изображение ниже

Вот ссылка на текстовый файл. Примерно на 1/3 вниз вы увидите в (), где находятся имена столбцов, а прямо под ними я отметил, где находятся данные для этих столбцов. Ниже по списку есть дополнительные данные, но мне просто нужно хорошо начать. У меня есть несколько похожих текстовых файлов, которые мне понадобятся для запуска кода.

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

1. изображения бесполезны. Пожалуйста, предоставьте образец ввода и вывода в виде выделенного текста

2. Привет, Роб, я обновил дополнительную информацию и ссылку на текстовый файл. Спасибо

Ответ №1:

Выполнение ETL на том, что является почти интерфейсом данных свободного формата, всегда является уродливым и нестабильным подходом

  1. рассматривайте определения столбцов как метаданные
  2. найдите метаданные, получите начальную и конечную строки этого
  3. очистите метаданные — есть определения столбцов, которые не существуют !
  4. теперь есть имена столбцов
  5. считайте, что остальные строки после последней строки метаданных являются фактическими данными
  6. reshape() это в массив, содержащий X максимально возможных строк в оставшихся данных
  7. выполните логику проверки после преобразования для фильтрации по тому, что кажется интересным набором данных
 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 # и заканчиваться на идентификаторе замораживания. Есть ли также способ добавить дополнительные столбцы из нескольких элементов, которые разделены символом (:) в текстовом файле? Если да, то куда пойдут эти строки кода? Я хотел бы добавить их информацию в конце