Pandas Dataframe - Изменить структуру данных (реорганизовать) - PullRequest
0 голосов
/ 02 июня 2018

Я читаю CSV-файл с данными тезисов:

CatPart 1           
CodeItem    1           
12  15  
5.5 3   

CodeItem    2           
7   6   
2   7       

CatPart 5           
CodeItem    0           
1   25  
1.5 7   

CodeItem    8           
25  1   
22  1

И я хотел бы иметь этот формат в кадре данных

CatPart CodeItem Weight Nb
1 1 12 15   
1 1 5.5 3       
1 2 7 6 
1 2 2 7 
5 0 1 25
5 0 1.5 7   
5 8 25  1
5 8 22  1

Итак, сначала я создаю заголовок с именем столбцовdf.columns = ["Weight", "Nb", "CatPart", "CodeItem"], и я удалил пустую строку.Моя стратегия заключалась в том, чтобы скопировать значение в строке CatPart в столбец Cartpart, эта часть была в порядке (см. Ниже) и после дублирования значения заменить Nan до следующего значения (сделать тот же CodeItem), а затем удалить строку CatPart иCodeItem, но я не нашел способа дублировать значение.

Weight      Nb  CatPart CodeItem
CatPart     1   1   nan
CodeItem    1   nan 1
12          15  nan nan
5.5         3   nan nan
CodeItem    2   2   nan
7           6   nan nan
2           7   nan nan
CatPart     5   5   nan
CodeItem    0   nan 0
1           25  nan nan
1.5         7   nan nan
CodeItem    8   8   nan
25          1   nan nan
22          1   nan nan

Или, может быть, это более простой способ сделать это, но я этого не вижу.

Спасибо за вашеПомогите!F.

1 Ответ

0 голосов
/ 02 июня 2018

Это не файл csv.

  • При изменении CatPart или CodeItem они помечаются полем в начале строки, за которым следует номер переменнойпробелов, а затем значение

  • weight & nb всегда отображается на одной строке, разделенной пробелом.

  • Запись можетсчитается заполненным, когда существует следующая информация CatPart, CodeItem, weight, nb.

Один из способов реструктуризации документа состоит в том, чтобы перебирать строки и получать записи, когда они заполнены.

import io
import re
import pandas as pd


text = """CatPart 1
CodeItem    1
12  15
5.5 3

CodeItem    2
7   6
2   7

CatPart 5
CodeItem    0
1   25
1.5 7
CodeItem    8
25  1
22  1"""

records = []
part, item, weight, nb = '', '', '', ''

for line in io.StringIO(text):
    if line.startswith('CatPart'):
        _, part = re.split('\s+', line.strip())
    if line.startswith('CodeItem'):
        _, item = re.split('\s+', line.strip())
    if re.match('^\d+', line):
        weight, nb = re.split('\s+', line.strip())
        records.append([part, item, weight, nb])

Обратите внимание, что я использовал io.StringIOсоздать файл в памяти для этого примера.Замените это на что-то вроде этого:

with open('/path/to/my/file.txt') as in_file:
    for line in in_file:
        ...

Затем передайте записи в конструктор pandas.DataFrame.

df = pd.DataFrame(records, columns=['CatPart', 'CatItem', 'weight', 'nb'])

создаст следующий вывод:

  CatPart CatItem weight  nb
0       1       1     12  15
1       1       1    5.5   3
2       1       2      7   6
3       1       2      2   7
4       5       0      1  25
5       5       0    1.5   7
6       5       8     25   1
7       5       8     22   1

ОднакоДо этого момента я не преобразовывал данные из строки.Вы можете выполнять преобразования при чтении данных или после структурирования данных в таблице с помощью:

df = df.astype(float)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...