【问题标题】:Creating a tag from one DataFrame column according to a group from another column in pandas python根据pandas python中另一列的组从一个DataFrame列创建标签
【发布时间】:2021-05-02 16:10:00
【问题描述】:

以下是我的数据框的简化: 我有数千个基因对,它们在不同的细胞类型和 3 种细胞类型中重复(可能有 9 种组合)

Gene pairs cell_types other_data
gene4_gene5 cell1_cell2
gene1_gene2 cell1_cell1
gene1_gene2 cell1_cell3
gene2_gene3 cell3_cell2
gene4_gene5 cell2_cell2
gene4_gene5 cell1_cell2

在我所有相同的基因对中(这里我使用 groupby)我想检查是否存在某些 cell_types 组合。如果它们是,例如一组基因对存在“cell1_cell2”、“cell1-cell3”和“cell1-cell1”,那么我想在一个新列中给这个基因对一个标签,说“cell1是一个通用发送者” "并且一个基因对可以有多个标签。我希望看到该列添加到我的原始 df 以用作元数据。 我看过多个问题和视频,无法正确编码。任何人都可以帮我一把吗?非常感谢

【问题讨论】:

    标签: python pandas pandas-groupby multilabel-classification


    【解决方案1】:

    鉴于您想坚持原始数据结构,一个解决方案可能是使用 df.loc 在 cell_types 列中查找与“基因对”列中的给定值匹配的所有值,将其转换为列出并检查定义“通用发送者”的预定义单元类型列表中的所有值是否出现在该列表中:

    import pandas as pd
    
    data = [ { "Gene pairs": "gene4_gene5", "cell_types": "cell1_cell2" }, { "Gene pairs": "gene1_gene2", "cell_types": "cell1_cell1" }, { "Gene pairs": "gene1_gene2", "cell_types": "cell1_cell3" }, { "Gene pairs": "gene2_gene3", "cell_types": "cell3_cell2" }, { "Gene pairs": "gene4_gene5", "cell_types": "cell1_cell1" }, { "Gene pairs": "gene4_gene5", "cell_types": "cell1_cell3" } ]
    df=pd.DataFrame(data)
    df['new column'] = df['Gene pairs'].apply(lambda x: "universal sender" if all(item in df.loc[df['Gene pairs'] == x]['cell_types'].tolist() for item in ["cell1_cell2", "cell1_cell3", "cell1_cell1"]) else None)
    

    输出:

    |    | Gene pairs   | cell_types   | new column       |
    |---:|:-------------|:-------------|:-----------------|
    |  0 | gene4_gene5  | cell1_cell2  | universal sender |
    |  1 | gene1_gene2  | cell1_cell1  |                  |
    |  2 | gene1_gene2  | cell1_cell3  |                  |
    |  3 | gene2_gene3  | cell3_cell2  |                  |
    |  4 | gene4_gene5  | cell1_cell1  | universal sender |
    |  5 | gene4_gene5  | cell1_cell3  | universal sender |
    

    或者您可以将其包装在一个函数中以获得更好的可读性,或者如果您想添加额外的过滤器:

    def lookup(row):
      cells = sorted(df.loc[df['Gene pairs'] == row['Gene pairs']]['cell_types'].tolist())
      if all(item in cells for item in ["cell1_cell2", "cell1_cell3", "cell1_cell1"]):
        return_value = "universal sender" 
      else:
        return_value = None
      return return_value
    
    df['new column'] = df.apply(lambda row: lookup(row), axis=1)
    

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 2018-08-25
      • 2022-10-15
      • 2020-02-11
      • 2012-10-15
      • 2020-09-20
      • 2020-04-16
      • 2021-03-02
      • 2023-01-04
      相关资源
      最近更新 更多