我正在尝试将一些数据转换为结构化格式并进行较小的转换。源代码是一个 .csv 文件,它实际上是半结构化的,如下所示:
我希望输出的结果数据看起来像这样,如果该方法搜索文字文本“事物”就可以了
我不偏爱实施,但环顾了 petl 和 pandas 却没有成功。你会如何解决这个问题?
我正在尝试将一些数据转换为结构化格式并进行较小的转换。源代码是一个 .csv 文件,它实际上是半结构化的,如下所示:
我希望输出的结果数据看起来像这样,如果该方法搜索文字文本“事物”就可以了
我不偏爱实施,但环顾了 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