如何将Python DataFrame行拆分为一对一映射格式?
解决Python DataFrame行的一对一映射拆分问题
你需要将DataFrame中包含多行值的列按顺序拆分成一对一的行,同时保留其他列的单个值。单独使用explode()会生成笛卡尔积而非对应映射,以下是可行的解决方案:
步骤1:构造示例数据
import pandas as pd # 模拟你的原始DataFrame df = pd.DataFrame({ 'A': ['valueA1', 'valueA2'], 'B': ['valueB1 <br /> valueB2 <br /> valueB3', 'valueB4'], 'C': ['valueC1 <br /> valueC2 <br /> valueC3', 'valueC4'] })
步骤2:将多行列分割为列表
先把用<br />分隔的字符串拆分成元素列表,同时清理多余空格:
# 分割B、C列,生成元素列表 df['B'] = df['B'].str.split(' <br /> ').apply(lambda x: [item.strip() for item in x]) df['C'] = df['C'].str.split(' <br /> ').apply(lambda x: [item.strip() for item in x])
步骤3:按对应位置拆分并展开
这里提供两种实现方式:
方式一:使用apply+pd.DataFrame展开
直接对每行生成对应长度的子DataFrame,再合并:
# 遍历每行,生成对应拆分后的子DataFrame并合并 result = df.apply( lambda row: pd.DataFrame({ 'A': [row['A']] * len(row['B']), 'B': row['B'], 'C': row['C'] }), axis=1 ).concat().reset_index(drop=True)
方式二:打包列后explode
先把需要对应拆分的列打包成元组列表,再拆分:
# 将B、C列的对应元素打包成元组列表 df['BC_pair'] = df.apply(lambda row: list(zip(row['B'], row['C'])), axis=1) # 展开打包后的列 result = df.explode('BC_pair') # 将元组拆分为B、C列 result[['B', 'C']] = pd.DataFrame(result['BC_pair'].tolist(), index=result.index) # 移除临时列 result = result.drop('BC_pair', axis=1).reset_index(drop=True)
最终结果
执行后result的输出为:
| A | B | C |
|---|---|---|
| valueA1 | valueB1 | valueC1 |
| valueA1 | valueB2 | valueC2 |
| valueA1 | valueB3 | valueC3 |
| valueA2 | valueB4 | valueC4 |
内容的提问来源于stack exchange,提问作者Sakshi Sharma
相关产品推荐
相关产品推荐

