如何正确对Pandas DataFrame列进行透视 按姓名聚合展示多个对应编号
问题原因
你直接将groupby生成的分组对象转为DataFrame的操作不符合pandas的语法逻辑:df.groupby()返回的是GroupBy迭代器,每一项是(分组键, 对应分组的子DataFrame)的元组,所以直接套pd.DataFrame()会得到你看到的、包含元组两部分的奇怪结果,而非预期的聚合表。
另外groupby不是只能传入统计类聚合函数,你完全可以用自定义聚合把同分组的多个值收集成列表再拆分,也可以用透视操作实现行转列,两种思路都能满足需求。
解决方法1:groupby + 列表拆分
import pandas as pd # 示例数据构造 df = pd.DataFrame({ 'NUMBER': ['000231', '009456', '100000901', '100008496'], 'NAME': ['John Stockton', 'Karl Malone', 'John Stockton', 'Karl Malone'] }) # 按NAME分组,把同组的NUMBER收集为列表 res = df.groupby('NAME', as_index=False)['NUMBER'].agg(list) # 把列表拆成两列,并重命名 res[['VALUE1', 'VALUE2']] = pd.DataFrame(res['NUMBER'].tolist(), index=res.index) # 删掉冗余的NUMBER列 res = res.drop('NUMBER', axis=1)
解决方法2:透视表(更符合行转列的场景逻辑)
# 先给每个NAME分组下的记录生成自增序号,作为透视后的列标识 df['col_idx'] = df.groupby('NAME').cumcount() + 1 # 透视操作:行索引为NAME,列索引为刚才生成的序号,值为NUMBER res = df.pivot(index='NAME', columns='col_idx', values='NUMBER').reset_index() # 重命名列名 res.columns = ['NAME', 'VALUE1', 'VALUE2']
两种方法输出的结果都符合预期:
| NAME | VALUE1 | VALUE2 |
|---|---|---|
| John Stockton | 000231 | 100000901 |
| Karl Malone | 009456 | 100008496 |
内容的提问来源于stack exchange,提问作者Zizzipupp
相关产品推荐
相关产品推荐

