比较两列并获得pandas中的唯一值

时间:2017-09-21 16:56:20

标签: python pandas csv

我有一个数据框,其中一些值在两个不同的列中

Ligand_hit,Ligand_miss
M00001,M00005
M00002,M00001
M00003,M00007
M00004,M00003

我想创建一个新列,其中“Ligand_miss”中的所有值都不在“Ligand_hit”中。所需的输出类似于:

Ligand_hit,Ligand_miss,Unique
M00001,M00005,M00005
M00002,M00001,M00007
M00003,M00007,NaN
M00004,M00003,NaN

我尝试使用“pandas.isin”,但它只输出布尔值。有没有一种简单的方法可以获得理想的结果?

5 个答案:

答案 0 :(得分:2)

直接的熊猫解决方案可以是这个:

df["Unique"] = df["Ligand_miss"][~df["Ligand_miss"].isin(df["Ligand_hit"])].drop_duplicates()

  Ligand_hit Ligand_miss  Unique
0     M00001      M00005  M00005
1     M00002      M00001     NaN
2     M00003      M00007  M00007
3     M00004      M00003     NaN

这为唯一值提供了索引查找。

答案 1 :(得分:1)

由于set

,你可以简单地使用vanilla python
In [129]: df
Out[129]: 
  Ligand_hit Ligand_miss
0     M00001      M00005
1     M00002      M00001
2     M00003      M00007
3     M00004      M00003

In [130]: pd.concat([df, pd.Series(list(set(df['Ligand_miss'].values) - set(df['Ligand_hit'].values)))], ignore_index=True, axis=1)
Out[130]: 
        0       1       2
0  M00001  M00005  M00007
1  M00002  M00001  M00005
2  M00003  M00007     NaN
3  M00004  M00003     NaN

一些解释:

  • set(df['Ligand_miss'].values)set(df['Ligand_hit'].values)获取2列中的唯一值。

  • set(...) - set(...)根据您的要求计算差异(“唯一”)。

  • pd.concat将结果合并到原始数据框中。

答案 2 :(得分:1)

基本列表理解将会:

[i for i in df.Ligand_miss if i not in df.Ligand_hit]

你也可以使用套装:

list(set(df.Ligand_miss)-set(df.Ligand_hit))

答案 3 :(得分:1)

Pandas中有一个名为isin()的函数。您可以使用它来查找 Ligand_hit Ligand_miss 的值。相反的是来自 Ligand_miss 的值,它们不在 Ligand_hit 中。然后,您必须根据反向对数据框进行子集化,并将其保存在新列中。例如:

假设您有数据框 items_data ,如下所示:

col_a  col_b
a_1    b_1
a_2    b_2
a_3    a_3
a_4    b_4
a_5    b_5

您可以通过以下代码行创建名为 col_def 的新列:

items_data['col_def'] = items_data['col_a'][~items_data['col_a'].isin(items_data['col_b'])]

这将通过反转isin()函数的结果为您提供 col_a 列中不在 col_b 中的项目。

答案 4 :(得分:0)

df['Unique']=df.loc[~df['Ligand_miss'].isin(df['Ligand_hit']),'Ligand_miss'].reset_index(drop=True)

df
Out[624]: 
  Ligand_hit Ligand_miss  Unique
0     M00001      M00005  M00005
1     M00002      M00001  M00007
2     M00003      M00007     NaN
3     M00004      M00003     NaN