【问题标题】:Python pandas print each group from a groupby object as a single rowPython pandas 将 groupby 对象中的每个组打印为单行
【发布时间】:2021-08-02 00:57:15
【问题描述】:

我有一个 groupby 对象

ref query_x query_y
    
ANN00118-RA Charonia_GIQZ01011680.1.p1  Typhlosyrinx_Contig7942.p1
ANN00127-RA Charonia_GIQZ01023156.1.p1  Typhlosyrinx_Contig11188.p1
ANN00130-RA Charonia_GIQZ01000168.1.p1  Typhlosyrinx_Contig15281.p1

数据按“ref”列分组。碰巧很多行都有相同的引用,例如

test.get_group('ANN12010-RA')


        query_x ref query_y
0   Charonia_GIQZ01000001.1.p1  ANN12010-RA Typhlosyrinx_Contig13935.p1
1   Charonia_GIQZ01000001.1.p1  ANN12010-RA Typhlosyrinx_Contig13936.p1
2   Charonia_GIQZ01000001.1.p1  ANN12010-RA Typhlosyrinx_TRINITY_DN17744_c0_g2_i1.p1
3   Charonia_GIQZ01000001.1.p1  ANN12010-RA Typhlosyrinx_TRINITY_DN18267_c0_g1_i1.p2

如您所见,第二列具有相同的值 ANN12010-RA,我想在其自己的文件中打印每个“参考”块,在一行上。示例的预期输出

ANN12010-RA Charonia_GIQZ01000001.1.p1  Typhlosyrinx_Contig13935.p1 Charonia_GIQZ01000001.1.p1 Typhlosyrinx_Contig13936.p1 Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRINITY_DN17744_c0_g2_i1.p1 Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRINITY_DN18267_c0_g1_i1.p2

元素的顺序并不重要。每行的列数可以变化,我不知道每组有多少个元素。

实现这一目标的最佳方法是什么?知道 groupby 对象可能有数千行。

非常感谢

使用我得到的答案

group_df.head()
index   0   1   2   3   4   5   6   7   8   9   ... 845 846 847 848 849 850 851 852 853 854
ref                                                                                 
ANN12010-RA Charonia_GIQZ01000001.1.p1 Typhlosyrinx_Con...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_Con...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRI...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRI...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRI...

ref 元素应该是行的一个元素,或者至少我应该能够打印它(我认为这是可能的)。唯一剩下的问题是,列是由成对的值而不是单个值组成的。作为输出,我想打印一个每行一个元素的文件。好的,我可以使用 awk 将 2 列输出转换为 1 列输出,但我想我会在 Python 中进行计算。

而且我希望我的输出文件的名称为“ref”,因此我的输出理想情况下是具有单列的单个文件,并且该文件将命名为 ANN12010-RA。

这有意义吗?

【问题讨论】:

    标签: python-3.x pandas group-by pandas-groupby


    【解决方案1】:

    这对我来说很难测试,因为没有代码可以让你的数据在我这边玩弄。

    不过,我相信这可能会奏效:

    # Same should work for your 'test' DF as a whole if you remove the .get_group(...) method below.
    # Though it is unclear the format of 'test' from your question, so not sure.
    group_df = test.get_group('ANN12010-RA').reset_index()
    
    # If either column is not already str, you should convert:
    group_df['query_x'] = group_df['query_x'].astype(str)
    group_df['query_y'] = group_df['query_y'].astype(str)
    
    # Make a "Joined" column for the queries. You can change '    ' to whatever you'd like.
    group_df['joined'] = group_df[['query_x', 'query_y']].agg('    '.join, axis=1)
    
    # Pivot the DF to display all on one line.
    group_df = group_df.pivot(index='ref', columns='index', values='joined')
    
    

    试一试,告诉我它对你有什么作用。

    编辑:关于输出,我想对与同一行上显示的相同“ref”匹配的所有元素进行分组。就像这样(第一个元素是用于分组的 ref)

    ANN12010-RA Charonia_GIQZ01000001.1.p1 Typhlosyrinx_Con...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_Con...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRI...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRI...  Charonia_GIQZ01000001.1.p1 Typhlosyrinx_TRI...
    

    但作为 data.frame 对象,我可以轻松导出到 csv 文件。

    【讨论】:

    • 您好,这提供了所需的输出,非常感谢。现在我有最后一个请求,实际上我的 group_by 对象中有一长串不同的“参考”。我想我可以简单地遍历它并为每个 ref 拥有一个独立的文件?对不起,我是 python 和 pythonic 成语的初学者。
    • 我的另一个问题是,在 group_df 中,ref 元素不是行的元素,它充当“行标题”,但我实际上需要它是行元素,或者至少是打印它的方式,因为我希望最终在文本文件中打印 group_df,它应该包含“ref”元素。
    • 我已经编辑了 mu 问题以添加您的代码给出的内容。我不知道这是否是在堆栈上做事的方式。
    • 当然!所以,一旦你觉得我的解决方案是可以接受的,你点击我的答案的复选标记。也就是说,我认为我没有正确回答您的问题;我不知道您想要不同的布局/输出,但我们绝对可以做到。您能否编辑您的问题以添加您希望在结果文件中看到的示例标题?
    猜你喜欢
    • 2023-01-10
    • 2021-08-19
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多