如何解决使用Python处理半结构化数据,如何根据前一行遇到的文本添加列值
我正在尝试将一些数据转换为结构化格式并进行较小的转换。源是一个 .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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。