Python搜索并替换为搜索结果

时间:2020-03-30 08:44:47

标签: python python-3.x pandas

您好,我有2个excel文件,其中一个是带有一些名称(col A,excel 1)和值的表,另一个是包含系统发育树,所有数据都存储在6列制表符中(excel 2 )。

Xlsx 1:

g__Mannheimia
g__Peptococcuscus
g__unspecific_Proteobacteria
g__不动杆菌

Xlsx 2(6列):

第1行:
d__细菌p__Proteobacteriac__γProteobacteriao__肠杆菌f__肠杆菌科g__沙门氏菌s__
第2行:
d__细菌p__Firmicutes c__杆菌o__乳酸杆菌f__链球菌g__链球菌s__
第3行:
d__细菌p__放线菌c__放线菌o__分枝杆菌f__分枝杆菌g__分枝杆菌s__
第4行:
d__细菌p__Proteobacteriac__γproteobacteriao__肠杆菌f__肠杆菌科g__Klebsiella s__
第5行:
d__细菌p__Proteobacteriac__γproteobacteriao__Monaxellaceae g__Acinetobacter s __

我要做的是,在xlsx 2的每一行中搜索xlsx 1中的名称,然后如果在6列中的任何一列上找到完全匹配的内容,则复制整行(总共6列),然后用此数据替换xlsx 1中的名称(1列,也应保持类似状态)。可以使用搜索和替换功能手动完成此操作,但是由于要处理的数据量很大,我正在尝试寻找另一种方法。

我正在尝试借助熊猫解决此问题,并且已经尝试了一些方法。此刻我被困在这里,因为我什至在第二个xlsx上找不到匹配的数据。

import sys
import pandas as pd

analysis_data_df = pd.read_excel('Mund_Biome_Raw_Data.xlsx', sheet_name='Genus', header=None, usecols='A', skiprows=3)
analysis_data = analysis_data_df.values.tolist()
# print(List1)
source_data_df = pd.read_excel('170519_taxonomy_in_qiime.xlsx', sheet_name='97_otu_taxonomy', header=None)
source_data = source_data_df.values.tolist()
# print(list_2)
matching = [s for s in source_data if any(xs in s for xs in analysis_data)]
print(matching)

非常感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用一种称为后缀自动机的算法,并高效地进行搜索(O(n)将O(nlogk)上的k作为其字母大小的常数),您可以在此处找到有关此算法及其实现的更多信息: https://cp-algorithms.com/string/suffix-automaton.html

因为比较的复杂程度不高,所以可以使用更简单,更短的算法,例如kmp,其中O(T + P)是T表示较大字符串的长度,P表示要查找的模式长度: https://www.google.com.co/amp/s/www.geeksforgeeks.org/kmp-algorithm-for-pattern-searching/amp/

或使用regex,它在python标准库中: https://docs.python.org/3/library/re.html 最后一种方法可能会花费更多时间进行计算,但实现起来更简单

干杯:)