我的实验室正在使用一种生成大量数据作为输出的软件,因此我试图使用 Python 使事情变得更容易。到目前为止,我认为最好的方法是生成列表并将其视为数据 block ,但这并不容易: 第一个数据 block 很简单:3 列是固定的,可以简单地通过以下方式获得:
chunk1 = my_data[:3]
第二 block 数据并不容易,因为它可以有2、3 或4 列。我认为这里的关键是第二个 block 在我们找到一个字母时结束(类似于1 3 7 CCC)。在这种情况下,我认为可以使用re 模块 来解析两列、三列或四列并在第一个字母之前停止,但我不知道该怎么做。我打算通过用零或“-”填充空位来“规范化”这些列,因此如果我有 2 列的情况,我会将其填充为 [x, y, 0, 0]以及带有 [x, y, z, 0] 的 3 列情况。
第三 block 是固定的(两个、三个或四个字母和一个数字),如下所示:CCC 119.62
剩下的是第 4 个 block 。
最终结果可能是这样的: ["s 91", "1.00", "OUT"] ["9", "3", "12", "7"] ["OCCC", "0.34"] ["f829", "27","f752","33"]
到目前为止,我一直在努力弄清楚如何让 re 模块 像这样工作:
非常感谢任何帮助,伙计们。
数据样本
s 27 1.00 STRE 30 16 OC 1.355049 f1291 50
s 28 -1.00 STRE 8 6 CC 1.494281 f1340 12 f1271 17
s 29 -1.00 STRE 14 15 NC 1.421282 f1358 49
s 30 1.00 STRE 14 15 NC 1.421282 f1337 10 f1290 33
s 31 1.00 STRE 8 6 CC 1.494281 f1171 15 f323 11
s 32 1.00 STRE 30 31 OC 1.419982 f1082 51 f1077 24
s 33 1.00 STRE 13 11 ClC 1.740581 f842 15 f323 19
s 34 -1.00 BEND 1 3 7 CCC 119.62 f1037 26 f485 10
s 35 -1.00 BEND 3 1 4 CCC 119.74 f1124 29
s 36 1.00 BEND 7 3 1 CCC 119.62 f733 25 f288 13
s 37 1.00 BEND 21 14 15 HNC 116.16 f1578 40 f1560 20
s 38 1.00 BEND 24 5 2 HCC 119.73 f1186 67
s 39 1.00 BEND 25 2 6 HCC 118.80 f1536 53 f1082 10 f1077 17
s 40 -1.00 BEND 24 5 2 HCC 119.73 f1508 44 f1171 14 f1124 13
s 41 1.00 BEND 25 2 6 HCC 118.80 f1669 14 f1271 32 f1124 15
s 42 -1.00 BEND 26 19 18 HCC 119.04 f1578 10 f1560 37 f1291 11
s 89 1.00 TORS 31 30 16 19 COCC 0.24 f161 14 f104 46 f87 19 f43 10
s 90 1.00 OUT 8 2 3 6 CCCC 1.09 f466 36 f125 22
s 91 1.00 OUT 9 3 12 7 OCCC 0.34 f829 27 f752 33
请您参考如下方法:
我写了一个生成器,它从迭代器中提取数据,直到找到字母字符串。
from itertools import chain
def while_not_alpha(iterator):
iterator = iter(iterator)
for s in iterator:
if not str(s).isalpha():
yield s
else:
yield chain([s], iterator)
break
def parse(line):
*chunk1, rest = line.split(maxsplit=4)
*chunk2, rest = while_not_alpha(rest.split())
rest = list(rest)
chunk3 = rest[:2]
chunk4 = rest[2:]
return chunk1, chunk2, chunk3, chunk4
# See below for definition of `txt`
chunk1, chunk2, chunk3, chunk4 = map(list, zip(*map(parse, txt.splitlines())))
我们可以看到chunk2看起来像
chunk2[:4]
[['30', '16'],
['8', '6'],
['14', '15'],
['14', '15']]
和chunk3
chunk3[:4]
[['OC', '1.355049'],
['CC', '1.494281'],
['NC', '1.421282'],
['NC', '1.421282']]
我们本可以更进一步制作数据框
chunk1, chunk2, chunk3, chunk4 = map(
pd.DataFrame, map(list, zip(*map(parse, txt.splitlines()))))
chunk2.head()
0 1 2 3
0 30 16 None None
1 8 6 None None
2 14 15 None None
3 14 15 None None
4 8 6 None None
5 30 31 None None
6 13 11 None None
7 1 3 7 None
8 3 1 4 None
9 7 3 1 None
10 21 14 15 None
11 24 5 2 None
12 25 2 6 None
13 24 5 2 None
14 25 2 6 None
15 26 19 18 None
16 31 30 16 19
17 8 2 3 6
18 9 3 12 7
或者更进一步:
df = pd.concat(
map(pd.DataFrame, map(list, zip(*map(parse, txt.splitlines())))),
axis=1, keys=[f'chunk{i}' for i in range(1, 5)]
)
df
chunk1 chunk2 chunk3 chunk4
0 1 2 3 0 1 2 3 0 1 0 1 2 3 4 5 6 7
0 s 27 1.00 STRE 30 16 None None OC 1.355049 f1291 50 None None None None None None
1 s 28 -1.00 STRE 8 6 None None CC 1.494281 f1340 12 f1271 17 None None None None
2 s 29 -1.00 STRE 14 15 None None NC 1.421282 f1358 49 None None None None None None
3 s 30 1.00 STRE 14 15 None None NC 1.421282 f1337 10 f1290 33 None None None None
4 s 31 1.00 STRE 8 6 None None CC 1.494281 f1171 15 f323 11 None None None None
5 s 32 1.00 STRE 30 31 None None OC 1.419982 f1082 51 f1077 24 None None None None
6 s 33 1.00 STRE 13 11 None None ClC 1.740581 f842 15 f323 19 None None None None
7 s 34 -1.00 BEND 1 3 7 None CCC 119.62 f1037 26 f485 10 None None None None
8 s 35 -1.00 BEND 3 1 4 None CCC 119.74 f1124 29 None None None None None None
9 s 36 1.00 BEND 7 3 1 None CCC 119.62 f733 25 f288 13 None None None None
10 s 37 1.00 BEND 21 14 15 None HNC 116.16 f1578 40 f1560 20 None None None None
11 s 38 1.00 BEND 24 5 2 None HCC 119.73 f1186 67 None None None None None None
12 s 39 1.00 BEND 25 2 6 None HCC 118.80 f1536 53 f1082 10 f1077 17 None None
13 s 40 -1.00 BEND 24 5 2 None HCC 119.73 f1508 44 f1171 14 f1124 13 None None
14 s 41 1.00 BEND 25 2 6 None HCC 118.80 f1669 14 f1271 32 f1124 15 None None
15 s 42 -1.00 BEND 26 19 18 None HCC 119.04 f1578 10 f1560 37 f1291 11 None None
16 s 89 1.00 TORS 31 30 16 19 COCC 0.24 f161 14 f104 46 f87 19 f43 10
17 s 90 1.00 OUT 8 2 3 6 CCCC 1.09 f466 36 f125 22 None None None None
18 s 91 1.00 OUT 9 3 12 7 OCCC 0.34 f829 27 f752 33 None None None None
设置
txt = """\
s 27 1.00 STRE 30 16 OC 1.355049 f1291 50
s 28 -1.00 STRE 8 6 CC 1.494281 f1340 12 f1271 17
s 29 -1.00 STRE 14 15 NC 1.421282 f1358 49
s 30 1.00 STRE 14 15 NC 1.421282 f1337 10 f1290 33
s 31 1.00 STRE 8 6 CC 1.494281 f1171 15 f323 11
s 32 1.00 STRE 30 31 OC 1.419982 f1082 51 f1077 24
s 33 1.00 STRE 13 11 ClC 1.740581 f842 15 f323 19
s 34 -1.00 BEND 1 3 7 CCC 119.62 f1037 26 f485 10
s 35 -1.00 BEND 3 1 4 CCC 119.74 f1124 29
s 36 1.00 BEND 7 3 1 CCC 119.62 f733 25 f288 13
s 37 1.00 BEND 21 14 15 HNC 116.16 f1578 40 f1560 20
s 38 1.00 BEND 24 5 2 HCC 119.73 f1186 67
s 39 1.00 BEND 25 2 6 HCC 118.80 f1536 53 f1082 10 f1077 17
s 40 -1.00 BEND 24 5 2 HCC 119.73 f1508 44 f1171 14 f1124 13
s 41 1.00 BEND 25 2 6 HCC 118.80 f1669 14 f1271 32 f1124 15
s 42 -1.00 BEND 26 19 18 HCC 119.04 f1578 10 f1560 37 f1291 11
s 89 1.00 TORS 31 30 16 19 COCC 0.24 f161 14 f104 46 f87 19 f43 10
s 90 1.00 OUT 8 2 3 6 CCCC 1.09 f466 36 f125 22
s 91 1.00 OUT 9 3 12 7 OCCC 0.34 f829 27 f752 33"""
