Изменить неупорядоченные данные в python как упорядоченный фрейм данных

я дал txt файл в следующем формате

a: 40     b: 20    c: 20     d: 00 23 4f 40 5f
a: 20     b: 30    c: 50     d: 23 45 21 54 43
a: 20     b: 30    c: 50     d: 23 45 21 
a: 20     b: 30    c: 50     d: 

я использовал функцию read_csv() для чтения файла Fiven. Однако я изо всех сил пытаюсь сделать этот тип формата в качестве фрейма данных для анализа.

окончательный фрейм данных, который я хочу,

a    b    c    d_1   d_2   d_3   d_4   d_5
40   20   20   00    23    4f    40    5f
20   30   50   23    45    21    54    43
20   30   50   23    45    21
20   30   50   

Я пробовал функцию разделения, используя '' в качестве делителя. Однако, поскольку есть данные, которые не записаны, это вызывает беспорядок.

Есть ли другой способ сделать этот тип данных фреймом данных.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
46
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это может быть сложно, если вы попытаетесь найти способ загрузить его с помощью read_csv(). Я думаю, было бы лучше, если бы вы очистили свои данные перед загрузкой во фрейм данных.

def check_index(list, index):
    return "" if index > (len(list)-1) else list[index].rstrip()

a, b, c, d1 ,d2, d3, d4, d5 = [] , [] ,[] , [],[] , [] ,[] , []
with open('./text.txt') as file:
    for line in file.readlines():
        values = list(compo.split(': ')[1] for compo in line.split('    ')) # 4 space split according to your sample data
        a.append(values[0])
        b.append(values[1])
        c.append(values[2])
        d_values = values[3].split(' ')
        d1.append(check_index(d_values,0))
        d2.append(check_index(d_values,1))
        d3.append(check_index(d_values,2))
        d4.append(check_index(d_values,3))
        d5.append(check_index(d_values,4))

df = pd.DataFrame(list(zip(a, b, c, d1 ,d2, d3, d4, d5)), columns = ['a', 'b', 'c', 'd1', 'd2', 'd3', 'd4', 'd5'])

Большое спасибо. У меня есть вопрос, означает ли комментарий «# 4 пробела в соответствии с вашими образцами данных», что в одной строке каждые данные имеют 4 пробела между ними? если это так, что мне делать, если расстояние между ними разное?

mingeuns 18.03.2022 01:31

@mingeuns да правильно. Если между ними есть разные пробелы, вам нужно найти уникальный разделитель, чтобы разделить его, например, используя «:» вместо «».

Kongvungsovanreach 18.03.2022 02:29

начните с:

s = """a: 40     b: 20    c: 20     d: 00 23 4f 40 5f
a: 20     b: 30    c: 50     d: 23 45 21 54 43
a: 20     b: 30    c: 50     d: 23 45 21 
a: 20     b: 30    c: 50     d: """

Разделить на ряды:

rows = s.split("\n")

rows
['a: 40     b: 20    c: 20     d: 00 23 4f 40 5f', 'a: 20     b: 30    c: 50     d: 23 45 21 54 43', 'a: 20     b: 30    c: 50     d: 23 45 21 ', 'a: 20     b: 30    c: 50     d: ']

Разделить строку на столбцы:

cols = row.split("    ")

cols
['a: 40', ' b: 20', 'c: 20', ' d: 00 23 4f 40 5f']

Разделите ячейку на букву столбца и значения:

cell = cols[-1]
letter, values = cell.split(":")
letter
' d'
values
' 00 23 4f 40 5f'

преобразовать букву и значения в словарь:

new_col = {f"{letter}_{i}": v for i, v in enumerate(values.strip(" ").split(" "))}
new_col
{' d_0': '00', ' d_1': '23', ' d_2': '4f', ' d_3': '40', ' d_4': '5f'}

Объедините словари вместе:

def merge_dicts(list_of_dicts: List[Dict[str, str]]):
    new_d = {}
    for d in list_of_dicts:
        new_d.update(d)
    return new_d

rows = [merge_dicts(row) for row in cells]

rows
[{'a_0': '40', 'b_0': '20', 'c_0': '20', 'd_0': '00', 'd_1': '23', 'd_2': '4f', 'd_3': '40', 'd_4': '5f'}, {'a_0': '20', 'b_0': '30', 'c_0': '50', 'd_0': '23', 'd_1': '45', 'd_2': '21', 'd_3': '54', 'd_4': '43'}, {'a_0': '20', 'b_0': '30', 'c_0': '50', 'd_0': '23', 'd_1': '45', 'd_2': '21'}, {'a_0': '20', 'b_0': '30', 'c_0': '50', 'd_0': ''}]

Преобразовать в фрейм данных:

df = pd.DataFrame(rows)

  a_0 b_0 c_0 d_0  d_1  d_2  d_3  d_4
0  40  20  20  00   23   4f   40   5f
1  20  30  50  23   45   21   54   43
2  20  30  50  23   45   21  NaN  NaN
3  20  30  50      NaN  NaN  NaN  NaN

полный код:

from typing import List, Dict
import pandas as pd

s = """a: 40     b: 20    c: 20     d: 00 23 4f 40 5f
a: 20     b: 30    c: 50     d: 23 45 21 54 43
a: 20     b: 30    c: 50     d: 23 45 21 
a: 20     b: 30    c: 50     d: """

def cell_to_dict(cell: str):
    letter, values = cell.split(":")
    letter = letter.strip(" ")
    values = values.strip(" ")
    d = {f"{letter}_{i}": v for i, v in enumerate(values.split(" "))}
    return d

def merge_dicts(list_of_dicts: List[Dict[str, str]]):
    new_d = {}
    for d in list_of_dicts:
        new_d.update(d)
    return new_d

def parse_file(s: str):
    rows = s.split("\n")
    cols = [row.split("    ") for row in rows]
    cells = [[cell_to_dict(cell) for cell in col] for col in cols]
    rows = [merge_dicts(row) for row in cells]
    df = pd.DataFrame(rows)
    return df


print(parse_file(s))

Это не совсем так, так как ячейка ["d_0"][3] - это '', а не NaN, и имена столбцов немного отличаются, но это довольно близко

Вам нужно создать новый список столбцов в нужном порядке, а затем использовать df = df[cols] для перестановки столбцов в этом новом порядке.

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

Community 17.03.2022 10:21

Другие вопросы по теме