Преобразуйте текстовый файл в фрейм данных, но структура текстового файла беспорядочная! (В Python) - PullRequest
0 голосов
/ 07 мая 2020

Итак, у меня есть текстовый файл, который я пробовал read_csv, но файловая структура не позволяет read_csv выдавать желаемый результат. Мне рекомендовали использовать функцию open(). вместо этого, но пока не удалось его успешно применить!.

Текстовый файл: Текстовый файл из Википедии этой структуры

Теперь мне нужен фрейм данных с двумя столбцами State и RegionName, но поскольку они выровнены по вертикали, я не могу получить желаемый результат.

Мой результат: Заполнен только один столбец, а остальное - NaN

Желаемый результат имеет вид:

{('Alabama','Auburn'),('Alabama','Florence'),('Alabama','Jacksonville') so on}

1 Ответ

3 голосов
/ 08 мая 2020

Предполагая, что все ваши данные структурированы так же, как на предоставленной фотографии, это должно работать:

import pandas as pd


df = pd.DataFrame(columns=["State", "RegionName"])

with open("example.txt") as f:
    content = f.read()
    lines = content.splitlines()
    state_split_str = "[edit]"
    region_split_str = "("
    for line in lines:
        if state_split_str in line:
            state = line.split(state_split_str)[0].strip()
        else:
            region = line.split(region_split_str)[0].strip()
            df = df.append({"State": state, "RegionName": region}, ignore_index=True)

print(df)

Результатом выше будет:

     State    RegionName
0  Alabama        Auburn
1  Alabama      Florence
2  Alabama  Jacksonville
3   Alaska     Fairbanks

Это работает, потому что мы знать, что всем школам в штате предшествует строка, содержащая название штата со знаком «[править]» рядом с ним. Мы просто проверяем, существует ли в строке «[edit]». Если это так, мы разбиваем на «[редактировать]» и переносим все влево (название состояния) через [0]. Для удобства мы обрезаем новую строку от любых начальных / конечных пробелов. Это дает нам наше государство. Продолжая перебирать каждую строку, мы знаем, что если строка не содержит «[edit]», это школа, принадлежащая текущему значению нашей переменной «state».

Затем мы просто выполняем аналогичное разбиение на открывающую скобку каждой строки, и снова возьмите первый элемент списка, возвращенного с помощью split, чтобы получить имя региона, снова обрезая пробелы. Поскольку теперь у нас есть значения State и RegionName, мы можем добавить их в наш фрейм данных.

Это идеальное решение? Не совсем, потому что мы жестко кодируем значения в нашем коде, чтобы разделить имена столбцов / для добавления, но из-за формата ваших данных я не уверен, что есть лучшее решение.

...