我有一个数据框,其中一些值在两个不同的列中
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”,但它只输出布尔值。有没有一种简单的方法可以获得理想的结果?
答案 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
:
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