如何用Pandas DataFrame实现按Version分组的指定格式输出?
问题描述
我有如下的Pandas DataFrame:
import pandas as pd data = { 'version': [4229, 6065, 9209, 2304, 4229, 6065, 9209, 2304, 4229, 6065, 9209, 2304, 4229, 6065, 9209, 2304], 'Numbers': [234, 567, 8910, 1122, 3344, 5566, 1234, 6789, 1376, 1111, 2222, 145, 267, 345, 557, 778] } df = pd.DataFrame(data)
我期望得到按version分组后的输出,每个版本对应的Numbers值排成一行:
4229 234 3344 1376 267 6065 567 5566 1111 345 9209 8910 1234 2222 557 2304 1122 6789 145 778
我尝试用df.groupby['version'],但没有得到预期的结果,希望有人能帮忙解决这个问题。
解决方案
其实你之前用df.groupby['version']只是拿到了分组对象,还需要进一步处理才能把每个组里的Numbers值展开成一行多列的形式。这里有两种简单好用的方法帮你实现需求:
方法1:分组后聚合为列表再展开
先把每个版本对应的Numbers聚合成一个列表,再把列表拆成多列,最后就能得到你要的格式:
# 按version分组,把每组的Numbers打包成列表 grouped_df = df.groupby('version')['Numbers'].agg(list).reset_index() # 将列表拆成单独的列 expanded_df = pd.DataFrame( grouped_df['Numbers'].tolist(), index=grouped_df['version'] ).reset_index() # 如果要和你预期的纯文本格式一致,可以这样打印 for _, row in expanded_df.iterrows(): print(' '.join(map(str, row.values)))
方法2:用序号标记分组内位置,再转置列
给每个版本下的每一行加个序号,然后通过透视把行转成列,也能达到效果:
# 给每个分组内的行分配顺序号 df['group_idx'] = df.groupby('version').cumcount() # 透视:version作为行,group_idx作为列,值是Numbers pivoted_df = df.pivot( index='version', columns='group_idx', values='Numbers' ).reset_index() # 打印成目标格式 for _, row in pivoted_df.iterrows(): # 去掉可能的空值(不过你的数据每个组都是4个值,这里其实可以不用) print(' '.join(map(str, row.dropna().values)))
两种方法都能输出你想要的结果,选哪种看你习惯就行~
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

