我有一个独特的frame
,如下所示:
GeneName position chromosome
ARS-1155 55562 14
ARS-2131 3132 4
ARS-4412 233 1
ARS-1121 411 5
...
我有一个base
的csv,有几百万行,看起来是:
BaseGeneName base_pos base_chrom
ARS-1155 5222 5
ARS-1155 5222 5
ARS-1323 32111 5
ARS-1233 51112 1
ARS-1121 1222 5
...
如U所见,第二帧不是唯一的,它可以包含GenesNames,这些容器也包含frame
。但是在碱基上它们可以具有不同的位置和染色体数目。
Base
只是一个新的GeneBank,我需要将职位从我的框架升级到Base
。
所以,如果我有
ARS-1155 55562 14
在frame
中应更改为
ARS-1155 5222 5
,并将附加到UpgradedDF
。如果frame
中有一些GeneName,而base
中没有,则应移到旧位置的UndefinedDF
中。
我用语句编写了一个for循环。像这样: (我记不太清,在电话上写东西)
listOfGenName = [allGeneNames from df]
for i in len(base):
a = base.where(base.baseGenName == i.GenName).dropna()
if a > 0:
UpgradedDF.append(a)
else:
UndefinedDF.append(a)
然后我放下重复项。
但是操作时间太长。我的意思是我添加了print(i +"/"+len(base))
,并计算出该操作将运行几天!
我尝试将其合并,但未成功。有人可以给我建议吗?
编辑:
恢复:
UpgradedDF
仅应是frame
和base
中存在的基因。因此,如果frame
中的A
和base
中的base[A]
应该移至UpgradedDF
,如果帧中的A
和base中的{ {t {1}}不可移动。如果A
中不是frame
,而A
中base
则什么也没有发生。
答案 0 :(得分:2)
我们可以执行以下操作:
base
Left merge
带有底框的框架base = base.drop_duplicates()
frame = frame.merge(base, left_on='GeneName', right_on='BaseGeneName', how='left')
frame['position'] = frame['base_pos'].fillna(frame['position'])
frame['chromosome'] = frame['base_chrom'].fillna(frame['chromosome'])
frame = frame.loc[:, :'chromosome']
输出
GeneName position chromosome
0 ARS-1155 5222.0 5.0
1 ARS-2131 3132.0 4.0
2 ARS-4412 233.0 1.0
3 ARS-1121 1222.0 5.0
答案 1 :(得分:1)
如果我正确理解...
听起来base
位于GeneName
中的所有frame
都需要放入UpgradedDF
UpgradedDF = base[base.BaseGeneName.isin(frame.GeneName)].drop_duplicates()
所有不在frame
中的base
都需要转到UndefinedDF
UndefinedDF = frame[~frame.GeneName.isin(base.BaseGeneName)]