Python 数据帧-更改数据结构(重新组织)

Python 数据帧-更改数据结构(重新组织),python,pandas,dataframe,data-structures,Python,Pandas,Dataframe,Data Structures,我读取了一个包含这些数据的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 我希望在数据帧中使用这

我读取了一个包含这些数据的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=[“重量”、“Nb”、“CatPart”、“代码项”] 我删除了空行。我的策略是将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.

这不是csv文件

  • CatPart
    CodeItem
    更改时,它们将在行首用字段标记,后跟可变数量的空格,然后是值

  • weight
    &
    nb
    始终显示在同一行上,以空格分隔

  • 当以下信息存在时,可以认为记录已填写。
    CatPart
    codeem
    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)