首页 > 解决方案 > 比较熊猫数据框中的两个字符串并显示差异

问题描述

例如对于牵引柱

target        read
AATGGCATC     AATGGCATG
AATGATATA     AAGGATATA
AATGATGTA     CATGATGTA

我想添加列

target        read       differnces
AATGGCATC     AATGGCATG  (C,G,8)
AATGATATA     AAGGATATA  (T,G,3)
AATGATGTA     CATGATGTA  (A,G,0)

标签: pythonpandas

解决方案


让我们拆分每个单词(同时删除初始空格)并创建一个堆叠的数据帧,在那里我们可以使用累积计数来计算每个出现的次数并删除所有重复项,同时最终创建我们的元组。

这里的关键函数是explode, str_split,stackdrop_duplicates

s = (
    df.stack()
    .str.split("")
    .explode()
    .to_frame("words")
    .replace("", np.nan, regex=True)
    .dropna()
)

s['enum'] = s.groupby(level=[0,1]).cumcount()

df["diff"] = (
    s.reset_index(0)[
        ~s.reset_index(0).duplicated(subset=["level_0", "words", "enum"], keep=False)
    ]
    .groupby("level_0")
    .agg(words=("words", ",".join), pos=("enum", "first"))
    .agg(tuple, axis=1)
)
                    

print(df)

     target       read      diff
0  AATGGCATC  AATGGCATG  (C,G, 8)
1  AATGATATA  AAGGATATA  (T,G, 2)
2  AATGATGTA  CATGATGTA  (A,C, 0)

print(s.reset_index(0)[
          ~s.reset_index(0).duplicated(subset=["level_0", "words", "enum"], keep=False)])

        level_0 words  enum
target        0     C     8
read          0     G     8
target        1     T     2
read          1     G     2
target        2     A     0
read          2     C     0

推荐阅读