【问题标题】:groupby function returns undesired result for pandas dataframegroupby 函数为 pandas 数据帧返回不需要的结果
【发布时间】:2022-01-17 07:22:54
【问题描述】:

所以我这里有这个数据框

>>> df
    uniprot_id protein_group protein_family protein_subfamily
0       Q8TAS1         Other            KIS               NaN
1       P35916            TK          VEGFR               NaN
2       Q96SB4          CMGC           SRPK               NaN
3       Q6P3W7         Other           SCY1               NaN
4       Q9UKI8         Other            TLK               NaN
..         ...           ...            ...               ...
561     Q96S53           TKL           LISK              TESK
562     Q13163           STE           STE7               NaN
563     P45985           STE           STE7               NaN
564     Q5VT25           AGC           DMPK               GEK
565     O00141           AGC            SGK               NaN

uniprot_id 列中有一些重复值 我想合并它们并使相同的值合并,但不同的值用分号分隔,因为这些重复的 uniprot_id 值的行相似但不相同

应用下面的代码后,我没有得到我想要的结果,我想知道我做错了什么

df2 = df.groupby(['uniprot_id'])['protein_group','protein_family','protein_subfamily'].apply(lambda x: '; '.join(set(x))).reset_index()
>>> print(df2)
     uniprot_id                                                 0
0    A0A0B4J2F2  protein_subfamily; protein_family; protein_group
1        A4QPH2  protein_subfamily; protein_family; protein_group
2        B5MCJ9  protein_subfamily; protein_family; protein_group
3        O00141  protein_subfamily; protein_family; protein_group
4        O00238  protein_subfamily; protein_family; protein_group
..          ...                                               ...
547      Q9Y616  protein_subfamily; protein_family; protein_group
548      Q9Y6E0  protein_subfamily; protein_family; protein_group
549      Q9Y6M4  protein_subfamily; protein_family; protein_group
550      Q9Y6R4  protein_subfamily; protein_family; protein_group
551      Q9Y6S9  protein_subfamily; protein_family; protein_group

我需要重复的行来组合并看起来像这样

    uniprot_id protein_group protein_family protein_subfamily
133       Q9UK32         Other            RSK; RSKb               RSKp90; RSKb

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用GroupBy.agg 并通过Series.dropna 删除缺失值:

    df2 = (df.groupby(['uniprot_id'])[['protein_group','protein_family','protein_subfamily']]
             .agg(lambda x: '; '.join(set(x.dropna())))
             .reset_index())
    
    print (df2)
      uniprot_id protein_group protein_family protein_subfamily
    0     O00141           AGC            SGK                  
    1     P35916            TK          VEGFR                  
    2     P45985           STE           STE7                  
    3     Q13163           STE           STE7                  
    4     Q5VT25           AGC           DMPK               GEK
    5     Q6P3W7         Other           SCY1                  
    6     Q8TAS1         Other            KIS                  
    7     Q96S53           TKL           LISK              TESK
    8     Q96SB4          CMGC           SRPK                  
    9     Q9UKI8         Other            TLK      
    

    如果顺序很重要,不要使用sets,因为没有定义顺序,请使用dict.fromkeys技巧:

    df2 = (df.groupby(['uniprot_id'])[['protein_group','protein_family','protein_subfamily']]
             .agg(lambda x: '; '.join(dict.fromkeys(x.dropna()).keys()))
             .reset_index())            
    

    【讨论】:

    • 是的,非常感谢,正是我想要的。有一些组合值不是我想要的确切顺序,但这只是我的原始数据/数据框的问题,我必须修复
    • @InanKhan - 你能检查一下最后的解决方案吗?
    猜你喜欢
    • 2013-07-07
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多