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

Using Python with semi-structured data, how to add a column value based on text encountered in preceding row

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

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

我不偏向于实施,但环顾了 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, 'label', 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