Python pandas 将 groupby 对象中的每个组打印为单行

Posted

技术标签:

【中文标题】Python pandas 将 groupby 对象中的每个组打印为单行【英文标题】:Python pandas print each group from a groupby object as a single row 【发布时间】: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。

这有意义吗?

【问题讨论】:

【参考方案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 问题以添加您的代码给出的内容。我不知道这是否是在堆栈上做事的方式。 当然!所以,一旦你觉得我的解决方案是可以接受的,你点击我的答案的复选标记。也就是说,我认为我没有正确回答您的问题;我不知道您想要不同的布局/输出,但我们绝对可以做到。您能否编辑您的问题以添加您希望在结果文件中看到的示例标题?

以上是关于Python pandas 将 groupby 对象中的每个组打印为单行的主要内容,如果未能解决你的问题,请参考以下文章

数据分析—Pandas 中的分组聚合Groupby 高阶操作

Python pandas 将 groupby 对象中的每个组打印为单行

使用 pandas python 将 2 个 groupby 输出与 lambda 组合

Python Pandas 如何将 groupby 操作结果分配回父数据框中的列?

Python pandas计算groupby后的份额

python处理数据的风骚操作[pandas 之 groupby&agg]