gpt4 book ai didi

pandas - 如何编写一个迭代 Pandas 数据框组并应用分层条件的函数?

转载 作者:行者123 更新时间:2023-12-04 08:29:49 24 4
gpt4 key购买 nike

我需要编写一个函数来根据一些分层条件过滤数据集。此函数的目的是为一堆蛋白质中的每个蛋白质获得一个注释。
该函数需要执行以下操作,

  • 按“id”列对蛋白质进行分组
  • 检查蛋白质组中的每个分析
  • 以优先的方式选择分析(这不是排序问题,因此应按条件顺序给出分析,以便以后可以重新排序)。首先,如果它不存在,则检查 analysis_1 然后取 analysis_2 或 analysis_3 等。
  • 将该行放入新的数据框中。

  • 这是将被过滤的数据示例,
    df=pd.DataFrame({
    'id': ['Protein_1', 'Protein_1', 'Protein_1',
    'Protein_2','Protein_2','Protein_2'],
    'analysis': ['analysis_6', 'analysis_4', 'analysis_1',
    'analysis_3','analysis_2','analysis_5'],
    'annotation':['annotation_1', 'annotation_2', 'annotation_3',
    'annotation_1','annotation_2','annotation_3'] })
    这是我想看到的输出,
    df_filtered= pd.DataFrame({
    'id': ['Protein_1','Protein_2'],
    'analysis': ['analysis_1', 'analysis_2'],
    'annotation':['annotation_3', 'annotation_2'] })
    下面的代码正在运行,但我想通过使用 pandas groupby、apply 和 iterrows 函数来实现。
    new_df =pd.DataFrame(columns=df.columns)
    protein_id=list(df.id.unique())

    for protein in protein_id:

    data=df[df["id"] == protein]

    if len(data[data["analysis"] =="analysis_1"]) == 0:

    if len(data[data["analysis"] =="analysis_2"]) == 0:

    if len(data[data["analysis"] =="analysis_3"]) == 0:
    pass
    else:
    data2=data[data["analysis"] =="analysis_3"]
    new_df = pd.concat([new_df,data2])

    else:
    data2=data[data["analysis"] =="analysis_2"]
    new_df = pd.concat([new_df,data2])

    else:
    data2=data[data["analysis"] =="analysis_1"]
    new_df = pd.concat([new_df,data2])

    new_df
    感谢任何帮助!

    最佳答案

    您可以临时对数据框进行排序,然后为每个 id 删除除一个条目之外的所有条目。它看起来像这样:

    df.sort_values('analysis').drop_duplicates(['id'], keep='first')
    请注意,这不会更改原始数据框中的顺序。结果如下所示:
              id    analysis    annotation
    2 Protein_1 analysis_1 annotation_3
    4 Protein_2 analysis_2 annotation_2
    如果您有一个返回分析优先级的函数,您可以将其与上述方法结合使用:
    def prio_function(analysis):
    # return a low number for a better result
    # and a high number for a worse result
    return int(analysis.split('_')[1]) # replace this row by your code

    df_work= df.assign(_prio=df['analysis'].apply(prio_function))
    df_work.sort_values('_prio').drop_duplicates(['id'], keep='first').drop(columns='_prio')
    如果优先级更简单,您还可以将字典传递给 apply而不是一个函数。

    关于pandas - 如何编写一个迭代 Pandas 数据框组并应用分层条件的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65076914/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com