【问题标题】:Using Pandas and Regex to search through and extract values of a txt file使用 Pandas 和 Regex 搜索和提取 txt 文件的值
【发布时间】:2019-11-14 04:26:30
【问题描述】:

我有 2 个试图从中提取值的数据表。这是我当前的脚本。

import re 
import os
import pandas as pd

os.chdir('C:/Users/Sams PC/Desktop')

test1=pd.read_csv('test1.txt', sep='\s+', header=None)
test1.columns=['Column_1','Column_2','Column_3']
test2=pd.read_csv('test2.txt', sep='\s+', header=None)
test2.columns=['Column_1','Column_2','Column_3','Column_4']

if 'S31N' in test1:
    data2=nhsqc[['Column_1','Column_2']].copy()
    if 'S31N-CA-HN' in test2:
        data2=nhsqc[['Column_3']].copy()
    else:
        print('Not Found')      
else:
    print('Not Found')


print(test1)
print (test2)

有了这个输出:

Not Found
0  S31N-HN   114.424     7.390
1  Y32N-HN   121.981     7.468
           Column_1  Column_2  Column_3  Column_4
0  S31N-A30CA-S31HN   114.424    54.808     7.393
1  S31N-A30CA-S31HN   126.854    53.005     9.277
2        S31N-CA-HN   114.424    61.717     7.391
3        S31N-HA-HN   126.864    59.633     9.287
4  Y32N-S31CA-Y32HN   121.981    61.674     7.467
5        Y32N-CA-HN   121.981    60.789     7.469
6  Q33N-Y32CA-Q33HN   120.770    60.775     8.582

我可以使用 pandas 来组织表格。接下来我想从与“S31N”相关的列中提取值。但是,如您所见,我的 if 行在查找 S31N 方面不起作用,即使它确实存在于我的数据表中。现在,如果我将该值更改为我的标题(如果 test1: 中的“Column_1”),那么它将起作用。我不完全明白为什么它无法搜索实际表,而只是搜索列标题。

此外,虽然我的 if 行确实有效(如果我使用了列标题),但第二个 if 行会从第一个 if 行覆盖 data2 表。如何将它作为额外的列添加到 data2 而不是覆盖它。

问题解决后,我删除了第二部分。但是主要问题仍然存在,我的脚本仍然无法找到我的值。更新脚本:

x=re.findall('[A-Z][0-9][0-9][A-Z]',str(test1))
y=re.findall('[A-Z][0-9][0-9][A-Z]-[C][A]',str(test2))
print (x,y)

for i in range (0,2):
    if x[i] in test1:
        data2=nhsqc[['Column_1','Column_2']].copy()
        if y[i] in test2:
            data2=nhsqc[['Column_3']].copy()
            print (data2)
        else:   
            print('Not Found')      
    else:
        print('Not Found')


print(x[i])

输出:

['S31N', 'Y32N'] ['S31N-CA', 'Y32N-CA']
Not Found
Not Found
Y32N

【问题讨论】:

  • 这仍然给了我同样的错误。 r 是做什么的?我一直在使用这个w3schools.com/python/python_regex.asp 来理解正则表达式,他们也有那个 r,但他们没有解释它的作用。
  • 对于类型,这是输出: 至于 str(test1),实际上最终可以工作。这是输出: ['S31N', 'Y32N'] ['S31N-CA', 'Y32N-CA'] 虽然,我不太清楚为什么会这样。据我了解, re.findall 中的第二个值只是告诉它要搜索的文档。我不明白 str 在这里做什么。如果我还将 if 行更改为: if str('x') in test1: 我仍然找不到输出。最后一件事,r 是否存在并没有什么不同,所以我仍然不知道它到底在做什么。
  • 啊我明白了,所以它在我的文档中找不到单词的原因是因为它们是单词而不是字符串? IE。它们的格式不正确?因为如果我将输入更改为现在:如果 test1 中的 x[0]:我仍然得到输出“未找到”
  • 我的正则表达式给出了正确的输出和值(所以 x[0] 给了我与'S31N'相同的东西),这正是我想要搜索的。我基本上是在尝试让我的脚本搜索我的数据,如果找到 S31N,则将其氮和氢(第 2 列和第 3 列)值“复制”到新表(data2)中。问题是我的脚本说值(S31N)不存在,即使它在我的表中如果我打印(test1)。

标签: python regex pandas


【解决方案1】:

我想,这可能会让你更接近。问题可能与test1test2 的类型有关,在整个代码中更改它们,str(test1)str(test1) 可能是使其工作的一种方法。

测试

x=re.findall('[A-Z][0-9][0-9][A-Z]',str(test1))
y=re.findall('[A-Z][0-9][0-9][A-Z]-[C][A]',str(test2))
print (x,y)

for i in range (0,2):
    if x[i] in str(test1):
        data2=nhsqc[['Column_1','Column_2']].copy()
        if y[i] in str(test2):
            data2=nhsqc[['Column_3']].copy()
            print (data2)
        else:   
            print('Not Found')      
    else:
        print('Not Found')


print(x[i])

模拟测试

import re
test1 = '''
0  S31N-HN   114.424     7.390
1  Y32N-HN   121.981     7.468
'''

test2 = '''
           Column_1  Column_2  Column_3  Column_4
0  S31N-A30CA-S31HN   114.424    54.808     7.393
1  S31N-A30CA-S31HN   126.854    53.005     9.277
2        S31N-CA-HN   114.424    61.717     7.391
3        S31N-HA-HN   126.864    59.633     9.287
4  Y32N-S31CA-Y32HN   121.981    61.674     7.467
5        Y32N-CA-HN   121.981    60.789     7.469
6  Q33N-Y32CA-Q33HN   120.770    60.775     8.582
'''

x = re.findall('[A-Z][0-9][0-9][A-Z]', str(test1))
y = re.findall('[A-Z][0-9][0-9][A-Z]-[C][A]', str(test2))
print(x, y)

for i in range(0, 2):
    if x[i] in str(test1):
        print(x[i])
        data2 = nhsqc[['Column_1', 'Column_2']].copy()
        if y[i] in str(test2):
            data2 = nhsqc[['Column_3']].copy()
            print(y[i])
        else:
            print('Not Found')
    else:
        print('Not Found')

输出

['S31N', 'Y32N'] ['S31N-CA', 'Y32N-CA']
S31N
S31N-CA
Y32N
Y32N-CA

【讨论】:

  • 这似乎是问题所在,现在可以了,谢谢! 2 件事:
  • 抱歉,无法编辑最后一个。 1) nhsqc 应更改为 test1,并为第二次迭代测试 2。 2) 有没有办法让 column_3 的值作为额外列从前一个循环添加到 data2 中,而不是像现在这样覆盖它。 3)目前,它正在复制 Column_1 的所有值,有没有办法让它只复制与 x[i] 相关联的值在其各自的列中。 IE。如果 x[1] 为 'S31N',则仅复制 Column_1 和 Column_2 中的 S31N 值,而不是列中的所有值。
  • 我在想一些类似的东西:data2=test1[['Column_1,'Column_2'][i]].copy() 和 test2 一样的东西,但这似乎不是工作。即使我打印 (test1['Column_1'][1]),我也只得到该列第一行中的值的输出
  • 对不起所有的 cmets,由于 5 分钟的时间限制,我无法编辑以前的 cmets。我在想如果我做 data2(i)=test1[['Column_1','Column_2'][i].copy() 应该保留每个循环的信息,然后我可以一起编译所有 data2(i) 值形成我正在尝试形成的表格。
  • 不想让它打开。我最终解决了我的上述问题。只需使用 .loc 和 append。
猜你喜欢
  • 2021-03-11
  • 2021-08-22
  • 2017-09-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多