使用Python处理半结构化数据,如何根据前一行遇到的文本添加列值

问题描述

我正在尝试将一些数据转换为结构化格式并进行较小的转换。源是一个 .csv 文件,实际上是半结构化的,如下所示:

enter image description here

我希望输出的结果数据看起来像这样,如果该方法搜索文字文本 'Thing' 就可以了

enter image description here

我不偏爱实施,但我已经环顾了 petl 和 pandas,但没有成功。 你会如何解决这个问题?

解决方法

import pandas as pd  
  
thing1 = pd.DataFrame([['A','B','C'],['D','E','F'],['G','H','I']])
thing2 = pd.DataFrame([['Z','Y','X'],['A','V','U'],['M','L','P']])

thing1.insert(0,'label',value = 'Thing1')
thing2.insert(0,value = 'Thing2')

thing1.append(thing2)

Out[17]: 
    label  0  1  2
0  Thing1  A  B  C
1  Thing1  D  E  F
2  Thing1  G  H  I
0  Thing2  Z  Y  X
1  Thing2  A  V  U
2  Thing2  M  L  P

编辑以解决评论

可能有更优雅的方式来做到这一点(注意这里添加了 reset_index,这是后续切片所必需的):

In [36]: thing3 = thing1.append(thing2).reset_index(drop = True)

In [37]: thing3
Out[37]: 
    label  0  1  2
0  Thing1  A  B  C # <-- slice from first 'A'
1  Thing1  D  E  F
2  Thing1  G  H  I
3  Thing2  Z  Y  X
4  Thing2  A  V  U # <-- to second 'A'
5  Thing2  M  L  P

In [38]: mask = thing3[0].between('A','A')

In [39]: mask
Out[39]: 
0     True
1    False
2    False
3    False
4     True
5    False
Name: 0,dtype: bool

In [40]: thing3[mask[mask].index[0]: mask[mask].index[1]]
Out[40]: 
    label  0  1  2
0  Thing1  A  B  C
1  Thing1  D  E  F
2  Thing1  G  H  I
3  Thing2  Z  Y  X

或者,如果您想包含最后一行,只需在切片中添加 1:

In [41]: thing3[mask[mask].index[0]: mask[mask].index[1] + 1]
Out[41]: 
    label  0  1  2
0  Thing1  A  B  C
1  Thing1  D  E  F
2  Thing1  G  H  I
3  Thing2  Z  Y  X
4  Thing2  A  V  U