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 组合