Python 如何用pandas中的特定语句合并整行?

Python 如何用pandas中的特定语句合并整行?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个逻辑问题,如果不使用for循环,我就无法解决它(它的DF很大,而且速度太慢) DF: 在上面我有三个案例: person1有2个带有TA等位基因的gene1-应该合并(路径是什么,但需要合并) person2具有3个CG/CA/CG的gene2-应将其平坦化为最常见的so CG,路径1或4 person3有2个带有GA/GC的gene3,所以这两行都应该删除,因为不可能得到最常见的 休息应该是不变的 所以结果应该是这样的: Gene1 person1 TA path1

我有一个逻辑问题,如果不使用for循环,我就无法解决它(它的DF很大,而且速度太慢)

DF:

在上面我有三个案例:

  • person1有2个带有TA等位基因的gene1-应该合并(路径是什么,但需要合并)
  • person2具有3个CG/CA/CG的gene2-应将其平坦化为最常见的so CG,路径1或4
  • person3有2个带有GA/GC的gene3,所以这两行都应该删除,因为不可能得到最常见的
  • 休息应该是不变的

    所以结果应该是这样的:

        Gene1    person1  TA   path1 or path2
        Gene2    person1  CG   path1
        Gene1    person2  GG   path3
        Gene2    person2  CG   path4 or 1
        Gene1    person3  GG   path6
        ...
    
    还有什么?这个文件很大,有10万人和3个基因,一个人可以在不同路径的相同基因上有X个数字(它是从1k个不同的文件中收集的)

    我试过什么? 只需使用不同的树循环整个数据帧。一个用于计数,一个用于删除重复项和合并,最后一个用于验证。 但我知道这是一个幼稚而糟糕的解决方案(需要20分钟以上),因此,如果您能给我一些建议,我将不胜感激。

    您需要两个步骤:

  • 使用每个基因人最常见的等位基因筛选完整的df
  • Groupby gene person并将路径连接到一行中
  • 如果我们可以忽略当前索引,那么:

    df.set_index(['gene', 'person', 'allele'], inplace=True)
    freq = df.groupby(df.index).count().sort_values('count', ascending=False).reset_index('allele')
    freq = freq.groupby(freq.index).first()
    df.reset_index('allele', inplace=True)
    df = df.loc[df.index.isin(freq.index), :]
    
    这应该是第一步。然后:

    df['all_paths'] = df.groupby(df.index)['path'].transform(lambda x: ' or '.join(x))
    df = df.drop_duplicates('all_paths').reset_index()
    # or df.set_index('allele', append=True, inplace=True)
    # just so df.index has no duplicates
    

    使用来连接行,如。

    什么是
    df.index
    你能放弃它并使用gene和person作为多索引吗?@RichieV现在,索引只有1…n。我想我可以,但我需要读一读,因为我不知道这有多大的可能,我想向你请教!我会试试:)但是你用
    排序值('count',升序=False)是什么意思?我是说col伯爵是什么?在同一行中
    .groupby().count()
    使用一个名为“count”的列创建一个df,因此我们使用它来按降序排序
    df['all_paths'] = df.groupby(df.index)['path'].transform(lambda x: ' or '.join(x))
    df = df.drop_duplicates('all_paths').reset_index()
    # or df.set_index('allele', append=True, inplace=True)
    # just so df.index has no duplicates