按列值合并多行并拆分多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:
- 第一个DataFrame包含
Age=2和Age=8的组(每组2条数据),列结构为Name, Name, Location, Location, Age - 第二个DataFrame包含
Age=4的组(3条数据),列结构为Name, Name, Name, Location, Location, Location, Age - 第三个DataFrame包含
Age=7的组(4条数据),列结构为Name*4, Location*4, Age
完全满足Location与对应Name顺序严格匹配、同类型列集中排列的要求。
内容的提问来源于stack exchange,提问作者SantoshGupta7
相关产品推荐
相关产品推荐

