如何按Region分组处理DataFrame并重组数据结构?
DataFrame按多列地区分组重组的实现方法
原始DataFrame格式
words ; in ; region1 ; region2 mars ; france ; marseille 3 ; marseille 1 lil ; france; lille marig ; italy; marseille 3 ; nantes 3
目标输出格式
regions ; words_list ; in_list marseille 3 ; ["mars","marig"] ; ["france","italy"] marseille 1 ; ["mars"] ; ["france"] lille ; ['lil'] ; ['france'] nantes 3; ["marig"] ; ['italy']
实现方案(Python + Pandas)
1. 读取并预处理数据
先读取原始数据,处理分号前后的空格,同时重命名冲突列名:
import pandas as pd from io import StringIO # 示例数据(实际可用pd.read_csv读取本地文件) data = """words ; in ; region1 ; region2 mars ; france ; marseille 3 ; marseille 1 lil ; france; lille marig ; italy; marseille 3 ; nantes 3""" df = pd.read_csv(StringIO(data), sep='\s*;\s*', engine='python') # 重命名"in"列避免与Python关键字冲突 df.rename(columns={'in': 'country'}, inplace=True)
2. 转换为长格式数据
把region1和region2两列拆分为多行,保留关联的words和country信息,并过滤空值:
# 宽表转长表,提取所有地区记录 long_df = df.melt( id_vars=['words', 'country'], value_vars=['region1', 'region2'], value_name='regions' ) # 移除无地区记录的无效行 long_df = long_df.dropna(subset=['regions'])
3. 分组聚合生成结果
按地区分组,将对应的words和country聚合为列表:
# 按地区分组,聚合关联的词汇和国家信息 result = long_df.groupby('regions').agg( words_list=('words', list), in_list=('country', list) ).reset_index()
4. 匹配目标输出格式(可选)
如果需要完全匹配目标的字符串格式,可做格式化调整:
# 调整列表的引号格式,统一为目标样式 result['words_list'] = result['words_list'].apply(lambda x: str(x).replace("'", '"')) result['in_list'] = result['in_list'].apply(lambda x: str(x)) # 输出分号分隔的结果 print(result.to_csv(sep=';', index=False))
运行上述代码后,就能得到符合要求的分组结果。
内容的提问来源于stack exchange,提问作者michel gold
相关产品推荐
相关产品推荐

