Python:根据索引列上的另一个数据帧中的另一列替换数据帧中的列

时间:2021-03-14 13:31:13

标签: python dataframe indexing replace merge

我有一个数据框 DF1:

<头>
1 2 3 4 ID
1 121 1313 + 102466751
2 112 133 + 6147
3 122 313 - 55207
4 212 413 - 113655
5 1012 343 + 79501

和另一个数据帧 DF2"

<头>
没有 合奏 ID
1212 ENSG00000146083 22838
1512 ENSG00000198242 6147
1262 ENSG00000134108 55207
1219 ENSG00000167700 113655
1512 ENSG00000070087 521

我正在尝试使用以下最终的 Dataframe DF3,它看起来像:

<头>
1 2 3 4 ID
1 121 1313 + 102466751
2 112 133 + ENSG00000198242
3 122 313 - ENSG00000134108
4 212 413 - ENSG00000167700
5 1012 343 + 521

当且仅当 DF1.ID == DF2.ID 时,DF3 包含在 DF2.ensembl 上,否则 DF1.ID 保持不变。

我用 Python 写的:

DF3['ID'] = DF1['ID'].apply(lambda x: DF2['Ensembl'] if DF1['ID'] == DF2['ID'] else DF1['ID'])

值错误为:

ValueError: 只能比较标记相同的系列对象

有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

您可以合并到 df1 中,然后用 Ensmbl 列中的非 NaN 值替换 ID。

df3 = pd.merge(df1, df2, on="ID", how="left")
m = ~df3["Ensmbl"].isna()

df3.loc[m, "ID"] = df3.loc[m, "Ensmbl"]
print(df3[df1.columns])

打印:

   1     2     3  4               ID
0  1   121  1313  +        102466751
1  2   112   133  +  ENSG00000198242
2  3   122   313  -  ENSG00000134108
3  4   212   413  -  ENSG00000167700
4  5  1012   343  +            79501

注意:我假设最后一个 ID 是 79501 而不是 521(可能是拼写错误。)