You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据匹配键的重复次数拆分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,输出结果与需求示例一致:

idCol1Col2Col3
0A100255
1B200nan800
2A100255
3C300400nan
4A100255
5A100255
6C300400nan

关键说明

  • 空值处理:Pandas的div方法会自动跳过空值,确保原DF_2中的空值在拆分后仍保持为空
  • 性能:针对800行的DF_1和100行的DF_2,该方案的计算效率完全够用,无需额外优化
  • 扩展性:如果DF_2有更多数值列,代码无需修改,numeric_cols会自动筛选所有非id列

内容的提问来源于stack exchange,提问作者sergei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:32:58