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

标签 pandas group-by iteration filtering hierarchical

我需要编写一个函数来根据某些分层条件过滤数据集。该函数的目的是为一组蛋白质中的每个蛋白质获取一个注释。

该函数需要执行以下操作,

  1. 按“id”列对蛋白质进行分组
  2. 检查蛋白质组中的每项分析
  3. 按优先级选择分析(这不是排序问题,因此应按条件顺序给出分析,以便稍后重新排序)。首先检查analysis_1,如果不存在则采用analysis_2或analysis_3等。
  4. 将该行放入新的数据框中。

这是将被过滤的数据的示例,

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/

相关文章:

elasticsearch - Elasticsearch-子集合中的元素分组

sql-server - SQL Server BIDS、SSIS 聚合和分组依据

python - 在列表上迭代格式字符串

python - 将列中的所有先前字符串作为列表存储在 Pandas 数据框中新列的单元格中

python - 使用 MultiIndex 计算 pandas hub_table 中的小计

python - Pandas匹配数据帧结构

php - 如何使用 Group By 和 Group_Concat 进行 Sphinx 搜索?

python - 使用循环更新 Python 数据框的特定行和列

dictionary - Clojure 迭代一个向量并向前看/向后看

迭代列表时的java代码优化