我不完全知道如何描述我遇到的问题,所以我只展示一下。我有2个数据表,并且我正在使用正则表达式根据是否与正确的单词匹配来搜索并提取这些表中的值。我将整个脚本作为参考。
import re
import os
import pandas as pd
import numpy as np
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']
x=re.findall('[A-Z][0-9][0-9][A-Z]-[H][N]',str(NHSQC))
y=re.findall('[A-Z][0-9][0-9][A-Z]-[C][A]-[H][N]',str(HNCA))
print (NHSQC)
print (HNCA)
print(x)
print (y)
data=[]
label=[]
for i in range (0,6):
if x[i] in str(NHSQC):
data2=NHSQC.set_index('Column_1',drop=False)
data3=(data2.loc[str(x[i]), 'Column_2':'Column_3'])
data.extend(list(data3))
a=[x[i]]
label.extend(a)
label.extend(a)
if y[i] in str(HNCA):
data2=HNCA.set_index('Column_1',drop=False)
data3=(data2.loc[str(y[i]),'Column_3'])
data.append(data3)
a=[y[i]]
label.extend(a)
else:
print('Not Found')
else:
print('Not Found')
data6=[label,data]
matrix=data6
data5=np.transpose(matrix)
print(data5)
f.write(str(data5))
f.close()
该脚本完全可以实现我想要的功能,并且在运行测试数据文件时可以按预期工作,但是在运行实际数据文件时会失败。我不知道如何解释这个问题,所以我只展示它。这是输出:
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]
['S31N-HN', 'Y32N-HN', 'Q33N-HN', 'A34N-HN', 'G35N-HN']
['S31N-CA-HN']
Traceback (most recent call last):
File "test.py", line 29, in <module>
if y[i] in str(HNCA):
IndexError: list index out of range
如您所见,存在一个问题,因为我的y正则表达式找不到所有值。此外,我的x正则表达式有多少个问题(只有5个而不是应有的数百个)。最初,我认为这只是一个显示对象(它不会显示数百个匹配项,因为这会花费很长时间),而且我还以为...中间打印我的桌子也是出于显示目的。但是,如果我复制了部分HNCA.txt数据并将其另存为单独的文件,则可以解决此问题。
[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
5 Y32N-S31CA-Y32HN 121.981 61.674 7.467
6 Y32N-CA-HN 121.981 60.789 7.469
7 Q33N-Y32CA-Q33HN 120.770 60.775 8.582
8 Q33N-CA-HN 120.701 58.706 8.585
9 A34N-Q33CA-A34HN 118.317 58.740 7.559
10 A34N-CA-HN 118.317 52.260 7.565
11 G35N-A34CA-G35HN 106.764 52.195 7.868
12 G35N-CA-HN 106.764 46.507 7.868
13 R36N-G35CA-R36HN 117.833 46.414 8.111
14 R36N-CA-HN 117.833 54.858 8.112
15 G37N-R36CA-G37HN 110.365 54.808 8.482
16 G37N-CA-HN 110.365 44.901 8.484
17 I55N-CA-HN 118.132 65.360 7.935
18 Y56N-I55CA-Y56HN 123.025 65.464 8.088
19 Y56N-CA-HN 123.025 62.195 8.082
20 A57N-Y56CA-A57HN 120.470 62.159 7.978
21 A57N-CA-HN 120.447 55.522 7.980
22 S72N-K71CA-S72HN 117.239 55.390 8.368
23 S72N-CA-HN 117.259 58.583 8.362
24 C73N-S72CA-C73HN 128.142 58.569 9.690
25 C73N-CA-HN 128.142 61.410 9.677
26 G74N-C73CA-G74HN 116.187 61.439 9.439
27 G74N-CA-HN 116.194 46.528 9.437
28 H75N-G74CA-H75HN 122.640 46.307 9.642
29 H75N-CA-HN 122.621 56.784 9.644
30 C76N-H75CA-C76HN 122.775 56.741 7.152
31 C76N-CA-HN 122.738 57.527 7.146
32 R77N-C76CA-R77HN 120.104 57.532 8.724
33 R77N-CA-HN 120.135 59.674 8.731
['S31N-HN', 'Y32N-HN', 'Q33N-HN', 'A34N-HN', 'G35N-HN']
['S31N-CA-HN', 'Y32N-CA-HN', 'Q33N-CA-HN', 'A34N-CA-HN', 'G35N-CA-HN', 'R36N-CA-HN', 'G37N-CA-HN', 'I55N-CA-HN', 'Y56N-CA-HN', 'A57N-CA-HN', 'S72N-CA-HN', 'C73N-CA-HN', 'G74N-CA-HN', 'H75N-CA-HN', 'C76N-CA-HN', 'R77N-CA-HN']
[['S31N-HN' '114.42399999999999']
我不会发布整个输出,但是如您所见,现在它可以找到所有正确的匹配项。现在,它还显示整个表格,而不是显示...,而仅显示上半部分和下半部分。我不太清楚这个问题是从哪里产生的。为什么只显示表格的上半部分和下半部分,但是如果我将其复制并粘贴到另一个文件中,则会显示整个内容。为什么regex即使未显示也不会在整个表中搜索(基于它显示了上半部分和下半部分的事实,我认为整个表都在那儿,但由于它试图简化表格的内容,因此再次没有显示它)显示,但是为什么显示的内容会影响正则表达式搜索的内容?
Python类可以定义两个“魔术”方法:
__repr__()
,应该以字符串形式表示对象的“表示形式”,并且对于大多数对象而言,它具有非常无用的默认实现;和__str__()
,它应该产生对象的可读“字符串”,并回退到__repr__()
。x=re.findall('[A-Z][0-9][0-9][A-Z]-[H][N]',str(NHSQC))
运行该行时,最后str(NHSQC)
一位告诉python调用NHSCQ.__str__()
,回退到NHSCQ.__repr__()
,您可以在此处阅读。
熊猫库开发人员的实现DataFrame.__repr__()
方式取决于某些全局变量的值,将产生一个不能完全表示基础数据的字符串。缺省值将截断DataFrame以仅显示前5行和后5行,并带有省略号(...
),告诉您缺少位。因此,正如您所怀疑的,您仅调用re.findall
DataFrame的前5行和后5行。
使用str(NHSQC)
可能不是您打算做的。这会将整个DataFrame转换为(不完整的)字符串表示形式,然后对该整个字符串运行正则表达式搜索。那是非常低效的,那么为什么不使用这些Series.str
方法呢?
举例来说,你似乎是排队Column_2
和Column_3
行的数据帧从NHSQC
那里的价值Column_1
相匹配,以第一个正则表达式与Column_3
从数据框中行的HNCA
,其中的价值Column_1
相匹配的正则表达式二,对不对?
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_1", "Column_3"]]
这些行将使用Series.str.match
on从两个DataFrame中选择必要的行和列Column_1
。
long1 = df1.melt(id_vars=["Column_1"]).drop("variable", axis="columns")
long2 = df2.rename(columns={"Column_3": "value"})
第一行用于DataFrame.melt
将三列的内容df1
转换为“更长的”版本,以列Column_1
作为标识符,variable
例如字符串"Column_2"
或"Column_3"
,以及value
,它们包含您实际关心的内容并在程序末尾打印。您不再使用列名,因此将其删除。DataFramedf2
不需要转换为更长的格式,因为它只有两列,因此我们将其重命名 Column_3
为value
。
extra_long = pd.concat([long1, long2])
print(extra_long.to_numpy())
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句