You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按列值合并多行并拆分多DataFrame(多列场景,SO问题跟进)

解决多列分组合并再拆分的问题

嘿,我来帮你搞定这个多列场景下的合并拆分需求!咱们的核心目标是按Age分组,把每组里的Name和Location按顺序对应扩展成多列,最后再按每组的行数(也就是扩展后的列数)把结果拆分成多个DataFrame,同时保证Location和对应的Name顺序完全匹配。

实现思路

咱们拆解成两步走:

  • 第一步:按Age对原始DataFrame分组,每个组内把Name和Location分别横向展开成多列,同类型列集中排列(先所有Name列,再所有Location列),最后保留Age列。
  • 第二步:把所有处理后的行收集起来,再根据它们的列数(对应原分组的行数)进行归类,列数相同的行合并成一个最终的DataFrame。

完整代码实现

import pandas as pd

# 原始数据
data = [['tom', 'ca', 2], ['ni2ck', 'ma', 2], ['j3uli', 'ny', 4] , ['nic4k', 'ma', 4], ['jul5i', 'ny', 4] , ['nic6k', 'ma', 7], ['ju7li', 'ny', 7] , ['nic8k', 'ma', 7], ['ju9li', 'ny', 7] , ['nic1k', 'ma', 8], ['car', 'ny', 8]]
df = pd.DataFrame(data, columns = ['Name', 'Location', 'Age'])

def process_single_group(group):
    # 将组内的Name横向展开,列名统一为"Name"
    name_expanded = pd.DataFrame(group['Name'].values.reshape(1, -1), columns=['Name']*len(group))
    # 将组内的Location横向展开,列名统一为"Location"
    loc_expanded = pd.DataFrame(group['Location'].values.reshape(1, -1), columns=['Location']*len(group))
    # 获取组内的Age值(同一组Age相同)
    age_col = pd.DataFrame({'Age': [group['Age'].iloc[0]]})
    # 合并三部分:先Name列,再Location列,最后Age列
    return pd.concat([name_expanded, loc_expanded, age_col], axis=1)

# 按Age分组处理所有组
processed_groups = [process_single_group(g) for _, g in df.groupby('Age')]
combined_df = pd.concat(processed_groups, ignore_index=True)

# 按列数拆分,将列数相同的行合并为一个DataFrame
split_result = {}
for idx, row in combined_df.iterrows():
    # 计算当前行的列数,作为分组key
    col_num = len(row)
    if col_num not in split_result:
        split_result[col_num] = []
    split_result[col_num].append(row.to_frame().T)

# 转换为最终的DataFrame列表
final_dataframes = [pd.concat(dfs, ignore_index=True) for dfs in split_result.values()]

# 打印验证结果
print("拆分后的多个DataFrame分别为:")
for i, df in enumerate(final_dataframes, 1):
    print(f"{i}.")
    print(df)
    print("-"*50)

结果验证

运行代码后,你会得到三个完全符合预期的DataFrame:

  1. 第一个DataFrame包含Age=2和Age=8的组(每组2条数据),列结构为Name, Name, Location, Location, Age
  2. 第二个DataFrame包含Age=4的组(3条数据),列结构为Name, Name, Name, Location, Location, Location, Age
  3. 第三个DataFrame包含Age=7的组(4条数据),列结构为Name*4, Location*4, Age

完全满足Location与对应Name顺序严格匹配、同类型列集中排列的要求。

内容的提问来源于stack exchange,提问作者SantoshGupta7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:24:09