简而言之,我正在尝试通过使用正则表达式作为索引从各种表中编译数据来生成新表。我以前的脚本(可以在这里Formatting issues using Regex and Pandas中进行)完全做到了这一点,但是,正如您在帖子中所看到的那样,由于正则表达式使用字符串,因此存在一个问题,但是pandas似乎存在一些问题。答案中的某个人发布了使用序列的更为简洁的方法,因此我一直在尝试实现这一点。我已经对其进行了一些修改以获得所需的输出,这是我当前的脚本:
mport re
import os
import pandas as pd
import numpy
os.chdir('C:/Users/Sams PC/Desktop')
f=open('test5.txt', 'w')
NHSQC=pd.read_csv('NHSQC.txt', sep='\s+', header=None)
NHSQC.columns=['Column_1','Column_2','Column_3']
HNCA=pd.read_csv('HNCA.txt', sep='\s+', header=None)
HNCA.columns=['Column_1','Column_2','Column_3','Column_4']
df1 = NHSQC.loc[NHSQC["Column_1"].str.match(re.compile("[A-Z][0-9][0-9][A-Z]-HN"))]
df2 = HNCA.loc[HNCA["Column_1"].str.match(re.compile("[A-Z][0-9][0-9][A-Z]-CA-HN")), ["Column_3"]]
#df3 = HNCACB.loc[HNCACB["Column_1"].str.match(re.compile("[A-Z][0-9][0-9][A-Z]-CB-HN")), ["Column_1", "Column_3"]]
long1=pd.concat([df1],ignore_index=True)
long2=pd.concat([df2],ignore_index=True)
long3=pd.concat([long1,long2],axis=1).stack()
print (long3)
a=long3.to_numpy()
print(a)
numpy.savetxt('data.txt',a, fmt='%5s')
这是我的数据表的样子。
Data Tables
Column_1 Column_2 Column_3
0 S31N-HN 114.424 7.390
1 Y32N-HN 121.981 7.468
2 Q33N-HN 120.740 8.578
3 A34N-HN 118.317 7.561
4 G35N-HN 106.764 7.870
5 R36N-HN 117.833 8.108
6 G37N-HN 110.365 8.483
7 I55N-HN 118.190 7.933
8 Y56N-HN 123.023 8.079
9 A57N-HN 120.470 7.980
10 S72N-HN 117.259 8.360
11 C73N-HN 128.142 9.678
12 G74N-HN 116.187 9.433
13 H75N-HN 122.640 9.643
14 C76N-HN 122.738 7.146
15 R77N-HN 120.143 8.732
16 G78N-HN 106.337 7.943
17 C79N-HN 125.089 9.172
18 Q80N-HN 119.163 8.711
19 L81N-HN 119.702 8.382
20 A84N-HN 118.920 7.495
21 G85N-HN 107.678 7.893
22 T86N-HN 108.793 8.203
23 H87N-HN 129.219 9.208
24 D89N-HN 121.596 10.626
25 Y90N-HN 119.615 6.855
26 Y91N-HN 127.756 9.139
27 T92N-HN 114.719 8.330
28 L93N-HN 127.305 9.106
29 A94N-HN 128.191 8.221
30 E96N-HN 122.914 8.617
31 K97N-HN 122.785 8.536
32 G98N-HN 113.339 8.847
33 K99N-HN 119.895 8.177
Column_3
3 61.717
6 60.789
8 58.706
10 52.260
12 46.507
14 54.858
16 44.901
17 65.360
19 62.195
21 55.522
23 58.583
25 61.410
27 46.528
29 56.784
31 57.527
33 59.674
35 47.214
37 65.321
39 59.562
41 57.634
42 52.695
44 45.872
46 59.954
48 53.088
50 53.811
52 55.543
54 57.106
56 60.419
58 53.801
60 49.596
61 56.221
63 58.398
65 45.722
67 55.322
Long3
0 Column_1 S31N-HN
Column_2 114.424
Column_3 7.39
Column_3 61.717
1 Column_1 Y32N-HN
...
32 Column_3 45.722
33 Column_1 K99N-HN
Column_2 119.895
Column_3 8.177
Column_3 55.322
要以我想要的格式组合系列(再次,就像我之前的循环一样,将第一行中的所有值[例如S31N]并堆叠起来),我消除了先前的索引(因为在原始文本文件,它们没有相同的行数,这可以通过df1和df2的索引看到,但是在df1和df2中,它们现在确实具有相同的行数),并将它们堆叠在一起。当每个“索引”(例如S31N)在我的原始txt文件中都有一个值时,这确实很好用,因为这意味着结果系列将具有相同的行数。但是,在我将要使用的所有文件中不是这种情况,在这些文件中的某些文件中,S31N没有值。我知道如果您使用原始文件的原始索引(即ignore_index = False),那么它只会简单地说Nan,这不会成为问题。但是,在我的原始文件中,它们的行数都不相同,因此,一个文件中S31N的值可能是第一个索引,但是S31N的值可能是第4或第5行(即,我不会能够使用我以前的方法来尝试解决此问题,因此这篇文章)。
如果这太长且令人困惑,我深表歉意,我只想确切说明我所做的事情以及我现在的位置。对我来说,最简单的解决方案是使用Column_1作为索引,并根据该索引进行concat(例如,concat S31N的所有值)。但是,根据我已经阅读并尝试过的内容,索引可能是True(使用原始txt文件作为排序),或者是False(摆脱了原始txt文件的排序),但我一直无法找到一种方法更改索引以使用其他值或字符串连接文件。
作为参考,这些是我的原始txt文件。
Column_1 Column_2 Column_3
0 S31N-HN 114.424 7.390
1 Y32N-HN 121.981 7.468
2 Q33N-HN 120.740 8.578
3 A34N-HN 118.317 7.561
4 G35N-HN 106.764 7.870
.. ... ... ...
89 R170N-HN 118.078 7.992
90 S171N-HN 110.960 7.930
91 R172N-HN 119.112 7.268
92 999_XN-HN 116.703 8.096
93 1000_XN-HN 117.530 8.040
[94 rows x 3 columns]
Column_1 Column_2 Column_3 Column_4
0 Assignment w1 w2 w3
1 S31N-A30CA-S31HN 114.424 54.808 7.393
2 S31N-A30CA-S31HN 126.854 53.005 9.277
3 S31N-CA-HN 114.424 61.717 7.391
4 S31N-HA-HN 126.864 59.633 9.287
.. ... ... ... ...
173 R170N-CA-HN 118.016 60.302 7.999
174 S171N-R170CA-S171HN 110.960 60.239 7.932
175 S171N-CA-HN 110.960 60.946 7.931
176 R172N-S171CA-R172HN 119.112 60.895 7.264
177 R172N-CA-HN 119.112 55.093 7.265
[178 rows x 4 columns]
Column_1 Column_2 Column_3 Column_4
0 Assignment w1 w2 w3
1 S31N-CA-HN 114.424 61.646 7.392
2 S31N-HA-HN 126.864 59.627 9.287
3 Y32N-CA-HN 121.981 60.890 7.469
4 Q33N-CA-HN 120.770 58.565 8.585
.. ... ... ... ...
243 S171N-R170CA-S171HN 110.960 59.873 7.935
244 S171N-CA-HN 110.977 60.730 7.933
245 S171N-CB-HN 110.960 63.317 7.930
246 R172N-CA-HN 119.112 54.990 7.254
247 R172N-CB-HN 119.112 31.158 7.269
[248 rows x 4 columns]
在这里您可以看到我在上面讨论的内容。我的第一个表中的S31N是索引0,而第二个表中的S31N是索引3。但是,由于两者都有值,因此在创建df1和df2时,如果忽略原始索引(ignore_index = True),则df1中的S31N和df2现在的索引为0。但是,对于没有值的情况,例如我的第3个表(在原始脚本中为#)。这意味着对于Y32N,两个txt文件中都再次有数据,因此如果忽略了原始索引,则df1和df2将为索引1,但在数据表3中它将为索引0(因为在df1中,从不能够找到S31N-CB-HN)。因此,我认为最简单的思考方法是使用Column_1(它将是实际的S31N或Y32N字符串)作为索引。
对于造成混淆的情况,我深表歉意。如果有任何需要澄清或不清楚的地方(或者您有任何建议更简洁地解释我的意图),请告诉我。谢谢!