Python 使用Regex和Pandas设置格式问题
我不知道该如何描述我遇到的问题,所以我会展示给大家看。 我有两个数据表,我使用regex搜索并提取这些表中的值,基于它是否与正确的单词匹配。我会把整个剧本作为参考Python 使用Regex和Pandas设置格式问题,python,regex,pandas,Python,Regex,Pandas,我不知道该如何描述我遇到的问题,所以我会展示给大家看。 我有两个数据表,我使用regex搜索并提取这些表中的值,基于它是否与正确的单词匹配。我会把整个剧本作为参考 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+', hea
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
我不会发布整个输出,但正如您所看到的,现在它找到了所有正确的匹配项。它现在也显示整个表,而不是执行。。。并且只显示上半部分和下半部分。我不太明白这个问题是从哪里来的。为什么它只显示表的上半部分和下半部分,但如果复制并粘贴到另一个文件,它会显示整个内容。为什么即使没有显示,regex也不搜索整个表(基于它显示上半部分和下半部分的事实,让我觉得整个表都在那里,但它也没有显示,因为它试图简化显示,但为什么显示的内容会影响regex搜索的内容)?为什么python只显示表的顶部和底部?
Python类可以:
- ,它应该以字符串的形式生成对象的“表示”,对于大多数对象来说,它有一个非常无用的默认实现;及
- ,它应该生成对象的可读“字符串”,并返回到
\uuuu repr\uuu()
x=re.findall('[A-Z][0-9][0-9][A-Z]-[H][N]',str(NHSQC))
时,最后一个str(NHSQC)
位告诉python调用NHSCQ.\uu str_uuuuuuuuuu()
,它返回到NHSCQ.\uuu repr\uuuuuuu()
,您可以阅读
pandas库的开发人员实现了DataFrame.\uuuu repr\uuuu()
,根据具体情况,将生成一个不能完全表示底层数据的字符串。默认值会截断数据帧,仅显示前5行和最后5行,并用省略号(…
)告诉您缺少位。因此,正如您所怀疑的,您只在数据帧的前5行和最后5行上调用re.findall
你应该怎么做?
使用str(NHSQC)
可能不是您想要做的。这会将整个数据帧转换为(不完整的)字符串表示形式,然后在整个字符串上运行正则表达式搜索。这是非常低效的,为什么不使用这些方法呢
例如,您似乎将数据帧NHSQC
中的行的Column_2
和Column_3
排列在一起,其中Column_1
的值与第一个正则表达式相匹配,顺序是数据帧HNCA
中的行的Column_3
,其中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"]]
这些行将使用onColumn\u 1
从两个数据帧中选择所需的行和列
long1 = df1.melt(id_vars=["Column_1"]).drop("variable", axis="columns")
long2 = df2.rename(columns={"Column_3": "value"})
第一行用于将df1
的三列转换为“较长”版本,其中列Column\u 1
作为标识符,variable
作为字符串“Column\u 2”
或“Column\u 3”
,以及value
,包含您真正关心的内容,并在程序结束时打印。您不再使用列名,因此它是。数据帧df2
不需要转换为更长的格式,因为它只有两列,所以我们只需将Column\u 3
转换为value
extra_long = pd.concat([long1, long2])
print(extra_long.to_numpy())
这只是将两个长数据帧放在一起,将它们转换为一个,然后打印出来。哇,这比我之前做的更干净、更高效。然而,我有几个问题。1) 如何从第2列和第3列中获取df1的值?据我所知,您已经明确指定了从哪些列获取值(例如,为什么我有我的语句['Column_2,Column3'])。如果留空,它只接受所有值(因此,您必须为df2指定它,因为您只需要一个值,而不是与该系列关联的所有OEN)。2) melt选项的问题在于它将列2和列3堆叠在彼此的顶部。我正在做的是…….将搜索(如S31N)列2和3的值叠加在一起,然后将long2s列3的值叠加在该列下(即,这是旧脚本给我的输出:
['S31N-HN''114.4239999999999']['S31N-HN''7.39']['S31N-CA-HN''61.717']
最后,我添加字符串的原因是因为regex不能处理列表。因此我必须将其转换为字符串,以便它可以处理它。(a)DataFrame.loc
选择所有列,除非另有说明。具体请参见“返回布尔序列的条件”示例。(b)如有必要,可以通过索引生成的extra_long
DataFrame来更改行的顺序。(c)是的,但看起来您希望将正则表达式应用于列表的值,而不是列表本身的字符串表示;字符串表示方法似乎很简单,但与您所经历的一样充满了潜在的陷阱。我并不是试图更改行本身的顺序。我希望根据值来堆叠顺序在第1列中(例如,S31N-HN的所有3个值都叠在一起)。例如,使用index=1进行索引不起作用,因为索引都不同。我想使用第一列的值作为索引(例如index='column_1'),但这似乎不太起作用(更不用说它是水平排列的,而我希望它们垂直堆叠。
extra_long = pd.concat([long1, long2])
print(extra_long.to_numpy())