如果两列之间存在反向,Pandas将删除重复项

2024-10-01 22:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列的数据集,如下所示。。。在

InteractorA InteractorB
AGAP028204  AGAP005846
AGAP028204  AGAP003428
AGAP028200  AGAP011124
AGAP028200  AGAP004335
AGAP028200  AGAP011356
AGAP028194  AGAP008414

我用的是Pandas,我想删除两次出现的行,但简单地颠倒如下。。。从这个。。。在

^{pr2}$

为了这个。。。在

InteractorA InteractorB
AGAP002741  AGAP008026

因为他们的意图和目的都是一样的。在

有没有内置的方法来处理这个问题?在


Tags: 数据pandaspr2agap002741agap011124agap028194agap003428agap005846
3条回答

这是我为自己的目的所做的最干净的解决方案。在

创建一个列,将每一行合并到一个已排序的列表中

df['sorted_row'] = [sorted([a,b]) for a,b in zip(df.InteractorA, df.InteractorB)]

无法删除列表上的重复项,因此该列应为字符串

^{pr2}$

删除重复项

df.drop_duplicates(subset=['sorted_row'], inplace=True)

我认为以下方法可行:

In [37]:
import pandas as pd
import io
temp = """InteractorA InteractorB
AGAP028204  AGAP005846
AGAP028204  AGAP003428
AGAP028200  AGAP011124
AGAP028200  AGAP004335
AGAP028200  AGAP011356
AGAP028194  AGAP008414
AGAP002741  AGAP008026
AGAP008026  AGAP002741"""
df = pd.read_csv(io.StringIO(temp), sep='\s+')
df
Out[37]:
  InteractorA InteractorB
0  AGAP028204  AGAP005846
1  AGAP028204  AGAP003428
2  AGAP028200  AGAP011124
3  AGAP028200  AGAP004335
4  AGAP028200  AGAP011356
5  AGAP028194  AGAP008414
6  AGAP002741  AGAP008026
7  AGAP008026  AGAP002741

因此,我下载了您的数据,误解了您的需求,因此以下内容将起作用:

^{pr2}$

现在,我们希望获得重复的行,但取第一个值:

In [74]:

df2 = df[df.InteractorA.isin(df.InteractorB)]
df2 = df2.groupby('InteractorA').first().reset_index()
df2.shape
Out[74]:
(3074, 2)

现在连接两个数据帧:

In [75]:

merged = pd.concat([df1, df2], ignore_index=True)
merged.shape
Out[75]:
(5460, 2)

我认为这是正确的。在

最后,我编写了一个hacky脚本,它遍历行和必要的数据片段,并检查是否出现了concatenate,或者是否出现了它的反向,并根据需要删除了行索引。在

import pandas as pd

checklist = []
indexes_to_drop = []

interactions = pd.read_csv('original_interactions.txt', delimiter = '\t')

for index, row in interactions.iterrows():
    check_string = row['InteractorA'] + row['InteractorB']
    check_string_rev = row['InteractorB'] + row['InteractorA']
    if (check_string or check_string_rev) in checklist:
        indexes_to_drop.append(index)
    else:
        pass
    checklist.append(check_string)
    checklist.append(check_string_rev)

no_dups = interactions.drop(interactions.index[indexes_to_drop])

print no_dups.shape

no_dups.to_csv('no_duplicates.txt',sep='\t',index = False)

2017年编辑:几年过去了,有了更多的经验,这是一个更优雅的解决方案,任何人寻找类似的东西:

^{pr2}$

相关问题 更多 >

    热门问题