如何处理Pandas DataFrame实现一行对应一个地址,关联信息分列?
解决方案:实现一行对应一个地址,拆分关联联系人信息为独立列
核心思路
针对当前数据中一个地址对应多条联系人记录的情况,我们可以通过「分组编号+透视转宽表」的方式,自动生成对应数量的姓名、电话、邮箱列,无需提前确定列数。
完整实现步骤及代码
1. 给每个地址下的联系人添加序号
假设你的df中,地址列名为address,联系人相关列是name、phone、email(请替换为你实际的列名):
# 按地址分组,为每组内的联系人分配递增序号 df['contact_idx'] = df.groupby('address').cumcount() + 1
2. 透视转宽表,生成独立联系人列
通过透视将同一地址下的多组联系人信息拆分为name_1、phone_1、email_1这类格式的列:
# 生成透视表,行保留地址(可追加其他需保留的非联系人字段),列由序号+字段名组成 pivoted_df = df.pivot( index=['address'], # 此处可添加其他和地址绑定的字段,如address_id、create_time等 columns='contact_idx', values=['name', 'phone', 'email'] ) # 重命名列,简化为「字段名_序号」的格式 pivoted_df.columns = [f'{col[0]}_{col[1]}' for col in pivoted_df.columns] # 将地址从索引转回普通列 final_df = pivoted_df.reset_index()
3. 合并非联系人元数据(可选)
如果原df中还有和地址一一对应的其他字段(如地址ID、创建时间),先提取唯一值再合并:
# 提取地址对应的唯一元数据 metadata_df = df.drop_duplicates('address')[['address', 'address_id', 'create_time']] # 合并到最终结果表 final_df = pd.merge(metadata_df, final_df, on='address', how='left')
模拟示例验证
假设你的df结构如下:
import pandas as pd # 模拟数据 sample_data = [ {'address': '北京市朝阳区XX路1号', 'name': '张三', 'phone': '138xxxx1234', 'email': 'zhangsan@xxx.com'}, {'address': '北京市朝阳区XX路1号', 'name': '李四', 'phone': '139xxxx5678', 'email': 'lisi@xxx.com'}, {'address': '上海市浦东新区XX街2号', 'name': '王五', 'phone': '137xxxx9012', 'email': 'wangwu@xxx.com'} ] df = pd.DataFrame(sample_data) # 执行处理流程 df['contact_idx'] = df.groupby('address').cumcount() + 1 pivoted_df = df.pivot(index='address', columns='contact_idx', values=['name', 'phone', 'email']) pivoted_df.columns = [f'{col[0]}_{col[1]}' for col in pivoted_df.columns] final_df = pivoted_df.reset_index() print(final_df)
输出结果:
address name_1 phone_1 email_1 name_2 phone_2 email_2 0 北京市朝阳区XX路1号 张三 138xxxx1234 zhangsan@xxx.com 李四 139xxxx5678 lisi@xxx.com 1 上海市浦东新区XX街2号 王五 137xxxx9012 wangwu@xxx.com NaN NaN NaN
关键说明
- 无需提前确定列数:
groupby.cumcount()会自动根据每个地址下的联系人数量生成序号,透视后自动匹配列数,空值位置可通过final_df.fillna('')替换为空字符串。 - 适配你的前置处理:你已经通过
explode将嵌套的联系人数据拆分为多行,上述流程可直接衔接使用。
内容的提问来源于stack exchange,提问作者Christopher Avallon
相关产品推荐
相关产品推荐

