如何编写一个遍历大熊猫数据框组并应用分层条件的函数?

k

我需要编写一个函数来根据某些分层条件过滤数据集。此功能的目的是为一堆蛋白质中的每种蛋白质获得一个注释。

该功能需要执行以下操作,

  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')

如果优先级比较简单,您还可以传递dicdicaryapply代替函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

大熊猫跨列对大型数据框应用条件

创建一个遍历大熊猫中大型数据集中的列的变量

如何将一个包含合并值的大熊猫数据框列拆分为几列

回填大熊猫数据框错过了第一个月

大熊猫:从现有的列值创建一个新的数据框

大熊猫每天将小时(仅小时)放入一个数据框中

如何在大熊猫DataFrame中将3列的组连接成一个?

如何加入两个大熊猫数据框

您如何遍历大熊猫数据框中的组,如何对每个组进行操作,然后将值分配给原始数据框?

如何在大熊猫中进行分组比的第一个和最后一个观察并广播数据框

大熊猫-按行元素按另一个数据框过滤数据框

大熊猫:根据另一个数据框的列选择数据框列

大熊猫使用另一个数据框列在数据框列中填充NaN

将两个大熊猫数据框与第一个索引相连吗?

在一个大熊猫数据框中将3个文本列折叠为1

大熊猫合并两个数据框,其中一个包含另一列的值

大熊猫将一个数据框与另一个groupby数据框组合在一起

大熊猫将数据框附加到另一个不合并列值

大熊猫:删除另一个数据框中的行,对列的子集进行比较

大熊猫:基于两列,用另一个数据框的值替换一个数据框的值

遍历大熊猫groupby组

如何从大熊猫的同一数据框中制作两个独立的seaborn图?

如何遍历大熊猫groupby并处理数据?

如何从一个大熊猫数据帧的行中减去另一行?

在第二个数据框中为每个观察找到一个大熊猫数据框中最近的(纬度/经度)观察

大熊猫通过数据框的2列将一个系列映射到另一个系列

有条件地在大熊猫分组中保留一个重复项

大熊猫:使用来自单独数据框中一个单元格的值填充数据框列中的所有行

大熊猫数据框的两列的唯一值