问题描述
我正在尝试将一些数据转换为结构化格式并进行较小的转换。源是一个 .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,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