首页 > 解决方案 > Python:根据索引列上另一个数据框中的另一列替换数据框中的一列

问题描述

我有一个数据框 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

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

我在 Python 中写道:

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

值错误是:

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

有什么帮助吗?

标签: pythondataframeindexingreplacemerge

解决方案


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

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(可能是错字。)


推荐阅读