[英]Compare two columns and get unique values in pandas
我有一个数据框,其中一些值位于两个不同的列中
Ligand_hit,Ligand_miss
M00001,M00005
M00002,M00001
M00003,M00007
M00004,M00003
我想创建一个新列,其中包含“ Ligand_hit”中所有不在“ Ligand_hit”中的值。 所需的输出如下所示:
Ligand_hit,Ligand_miss,Unique
M00001,M00005,M00005
M00002,M00001,M00007
M00003,M00007,NaN
M00004,M00003,NaN
我尝试使用“ pandas.isin”,但它仅输出布尔值。 有没有简单的方法来获得所需的结果?
一个直接的熊猫解决方案可以是这样的:
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
这为唯一值提供了索引查找。
您可以简单地使用vanilla python,这要感谢set
:
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
将结果合并到原始数据帧中。
基本的列表理解将做到:
[i for i in df.Ligand_miss if i not in df.Ligand_hit]
您也可以为此使用集:
list(set(df.Ligand_miss)-set(df.Ligand_hit))
在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中的项目。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.