я дал 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
Я пробовал функцию разделения, используя '' в качестве делителя. Однако, поскольку есть данные, которые не записаны, это вызывает беспорядок.
Есть ли другой способ сделать этот тип данных фреймом данных.
Это может быть сложно, если вы попытаетесь найти способ загрузить его с помощью 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'])
@mingeuns да правильно. Если между ними есть разные пробелы, вам нужно найти уникальный разделитель, чтобы разделить его, например, используя «:» вместо «».
начните с:
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] для перестановки столбцов в этом новом порядке.
Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Большое спасибо. У меня есть вопрос, означает ли комментарий «# 4 пробела в соответствии с вашими образцами данных», что в одной строке каждые данные имеют 4 пробела между ними? если это так, что мне делать, если расстояние между ними разное?