如何根据匹配键的重复次数拆分DataFrame中的值?
按重复键拆分DataFrame数据的实现方案
核心思路
先统计DF_1中每个键的重复次数,将DF_2中对应键的数值列除以该次数,最后按照DF_1的键顺序展开数据,得到拆分后的结果。
代码实现(基于Pandas)
首先导入依赖库并构造示例数据:
import pandas as pd # 构造示例DF_1和DF_2 df1 = pd.DataFrame({'id': ['A', 'B', 'A', 'C', 'A', 'A', 'C']}) df2 = pd.DataFrame({ 'id': ['A', 'B', 'C'], 'Col1': [400, 200, 600], 'Col2': [100, None, 800], 'Col3': [20, 800, None] })
步骤1:统计每个键的重复次数
计算DF_1中每个id的出现次数,用于后续数值拆分:
id_counts = df1['id'].value_counts().reset_index() id_counts.columns = ['id', 'count']
步骤2:关联次数与DF_2数据
将次数表与DF_2合并,让每个键对应上自己的拆分次数:
df_merged = pd.merge(df2, id_counts, on='id', how='right')
步骤3:拆分数值列
对DF_2中的数值列执行除法操作,除以对应键的重复次数,空值保持不变:
# 筛选出所有数值列(排除id列) numeric_cols = df2.columns.drop('id') # 按行除以次数,空值自动保留 df_merged[numeric_cols] = df_merged[numeric_cols].div(df_merged['count'], axis=0)
步骤4:按DF_1顺序生成结果
根据DF_1的id顺序,提取对应拆分后的数据,最终整理成目标格式:
# 按df1的id顺序匹配数据并重置索引 result = df_merged.set_index('id').loc[df1['id']].reset_index() # 移除临时的count列 result = result.drop('count', axis=1)
执行后result即为目标DataFrame,输出结果与需求示例一致:
| id | Col1 | Col2 | Col3 | |
|---|---|---|---|---|
| 0 | A | 100 | 25 | 5 |
| 1 | B | 200 | nan | 800 |
| 2 | A | 100 | 25 | 5 |
| 3 | C | 300 | 400 | nan |
| 4 | A | 100 | 25 | 5 |
| 5 | A | 100 | 25 | 5 |
| 6 | C | 300 | 400 | nan |
关键说明
- 空值处理:Pandas的
div方法会自动跳过空值,确保原DF_2中的空值在拆分后仍保持为空 - 性能:针对800行的DF_1和100行的DF_2,该方案的计算效率完全够用,无需额外优化
- 扩展性:如果DF_2有更多数值列,代码无需修改,
numeric_cols会自动筛选所有非id列
内容的提问来源于stack exchange,提问作者sergei
相关产品推荐
相关产品推荐

