【问题标题】:Python search and replace with search resultPython搜索并替换为搜索结果
【发布时间】:2020-03-30 08:44:47
【问题描述】:

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

Xlsx 1:

g__曼海姆
g__消化球菌
g__unspecific_Proteobacteria
g__不动杆菌

Xlsx 2(6 列):

第 1 行:
d__细菌 p__Proteobacteria c__Gammaproteobacteria o__Enterobacterales f__Enterobacteriaceae g__Salmonella s__
第 2 行:
d__细菌 p__Firmicutes c__Bacilli o__Lactobacillales f__Streptococcaceae g__Streptococcus s__
第 3 行:
d__细菌 p__Actinobacteriota c__Actinobacteria o__Mycobacteriales f__Mycobacteriaceae g__Mycobacterium s__
第 4 行:
d__细菌 p__Proteobacteria c__Gammaproteobacteria o__Enterobacterales f__Enterobacteriaceae g__Klebsiella s__
第 5 行:
d__Bacteria p__Proteobacteria c__Gammaproteobacteria o__Pseudomonadales f__Moraxellaceae g__Acinetobacter s__

我想要做的是,在 xlsx 2 的每一行中搜索 xlsx 1 中的名称,然后如果在 6 列中的任何一个上找到完全匹配,则复制整行(总共 6 列)和用此数据替换 xlsx 1 中的名称(1 列,也应保持不变)。这可以通过搜索和替换功能手动完成,但由于数据量巨大,我正在尝试寻找另一种方法。

我正在尝试在 pandas 的帮助下解决这个问题,并且已经尝试了一些东西。目前我被困在这里,因为我什至无法在第二个 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)

非常感谢任何形式的帮助!

【问题讨论】:

  • 更具体:如果 source_data (第一个 Excel 文件)中的一行在 analysis_data (第二个 Excel 文件)中有几行包含它,你应该怎么做?您是否每次都在同一行索引中搜索?
  • 编辑我的帖子更具体。

标签: python python-3.x pandas


【解决方案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/

或者使用python标准库中的正则表达式: https://docs.python.org/3/library/re.html 最后一种方法可能会花费更多时间来计算,但它的实现更简单

干杯:)

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多