我有两个蛋白质序列列表,我必须检查两个列表中每个条目的存在,比如
list A = [1,2,3,4]
list B= [3,4,5]
## just an example. The result would be convert into csv
result = [
[1, true, false],
[2, true, false], ## 2 only exist in the first list
[3, true, true], ## 3 exist in both lists
[4, true, true],
[5, false, true]
]
我将两个序列加载到两个不同的数据帧中,但我无法弄清楚如何在数据帧中操作它们。我最终将它们加载到一个集合中并形成一个列表然后转换回数据帧。我认为正确的方法应该是在数据帧中原生地进行
def FindDifferences():
df1 = pd.read_csv('Gmax_v6_annotation_info.txt', names=['name'], usecols=[0], delimiter='\t')
df2 = pd.read_csv('Gmax_v9_annotation_info.txt', names=['name'], usecols=[2], delimiter='\t')
v6_set = set(df1['name'])
v9_set = set(df2['name'])
result = []
for val in v6_set:
if val in v9_set:
result.append([val, True, True])
else:
result.append([val, True, False])
for val in v9_set:
if val not in v6_set:
result.append([val, False, True])
result_df = pd.DataFrame(result, columns=['name', 'inv6', 'inv9'])
result_df.to_csv('result_csv.csv', index=False, header=False)
return
我确实尝试过做
new_dataframe.loc[new_dataframe.shape[0]] = [val, False, False]
而非附加到本机列表
但它太慢了我不得不削减执行力。使用列表实现它甚至不需要一秒钟。
答案 0 :(得分:1)
您可以在启用merge
的情况下使用indicator
创建 _merge 列,该列提供有关连接列中的值是存在于左侧还是右侧或两者中的信息数据框,然后您可以从中创建两个指示列:
df1 = pd.DataFrame({'name': A})
df2 = pd.DataFrame({'name': B})
(df1.merge(df2, how='outer', indicator=True)
.assign(inv6 = lambda x: x._merge != "right_only",
inv9 = lambda x: x._merge != "left_only")
.drop("_merge", 1))