【问题标题】:Python: replace a column from a dataframe based on another column from another dataframe over an index columnPython:根据索引列上另一个数据框中的另一列替换数据框中的一列
【发布时间】:2021-06-11 23:00:13
【问题描述】:

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

no Ensmbl 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: 只能比较标签相同的 Series 对象

有什么帮助吗?

【问题讨论】:

    标签: python dataframe indexing replace merge


    【解决方案1】:

    您可以合并到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(可能是错字。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 2023-04-03
      • 1970-01-01
      • 2021-09-08
      • 2021-06-29
      相关资源
      最近更新 更多