Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Regex和Pandas设置格式问题_Python_Regex_Pandas - Fatal编程技术网

Python 使用Regex和Pandas设置格式问题

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

我不知道该如何描述我遇到的问题,所以我会展示给大家看。 我有两个数据表,我使用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+', 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"]]
这些行将使用on
Column\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())