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

基于Type维度分解Fractional Assignation的数据集处理需求

数据集处理:基于Type维度分解fraction字段

原始数据集

IDCountryCountfractionType
1Austria100.33A
1Belgium100.66B
1Belgium100.66B
2Czech150.25C
2Denmark150.75C
2Denmark150.75D
2Denmark150.75D

说明:fraction字段为每个ID下对应国家的占比

需求说明

需要基于Type维度对数据集进行分解,规则如下:

  • 每个ID需生成「该ID下唯一国家数量 × 该ID下唯一Type数量」的行数据
  • 新增newfraction字段,计算方式为:当前国家的fraction × (该ID下唯一Type数量的倒数)

示例输出

IDCountryCountfractionTypenewfraction
1Austria100.33A0.33*0.5
1Austria100.33B0.33*0.5
1Belgium100.66A0.66*0.5
1Belgium100.66B0.66*0.5
2Czech150.25C0.25*0.5
2Czech150.25D0.25*0.5
2Denmark150.75C0.75*0.5
2Denmark150.75D0.75*0.5

注:示例中Type字段仅作演示,实际需生成该ID下所有唯一Type的组合

解决方案(Python Pandas)

以下代码可实现需求:

import pandas as pd

# 构造原始数据集
df = pd.DataFrame({
    'ID': [1,1,1,2,2,2,2],
    'Country': ['Austria','Belgium','Belgium','Czech','Denmark','Denmark','Denmark'],
    'Count': [10,10,10,15,15,15,15],
    'fraction': [0.33,0.66,0.66,0.25,0.75,0.75,0.75],
    'Type': ['A','B','B','C','C','D','D']
})

# 1. 提取每个ID下的唯一国家和唯一Type集合
id_country_map = df.groupby('ID')['Country'].unique().reset_index(name='countries')
id_type_map = df.groupby('ID')['Type'].unique().reset_index(name='types')

# 2. 生成国家与Type的笛卡尔积
id_combinations = pd.merge(id_country_map, id_type_map, on='ID')
id_combinations = id_combinations.explode('countries').explode('types')

# 3. 关联原始数据中的Count和fraction(去重避免重复值)
country_base_info = df.drop_duplicates(subset=['ID','Country'])[['ID','Country','Count','fraction']]
result = pd.merge(
    id_combinations,
    country_base_info,
    left_on=['ID','countries'],
    right_on=['ID','Country'],
    how='left'
).drop(columns=['countries']).rename(columns={'types':'Type'})

# 4. 计算newfraction
type_count_per_id = df.groupby('ID')['Type'].nunique().reset_index(name='type_count')
result = pd.merge(result, type_count_per_id, on='ID')
# 若需数值结果
result['newfraction'] = result['fraction'] * (1 / result['type_count'])
# 若需保留表达式形式(如"0.33*0.5"),替换为下面一行
# result['newfraction'] = result['fraction'].astype(str) + '*' + (1/result['type_count']).round(2).astype(str)

# 调整列顺序
result = result[['ID','Country','Count','fraction','Type','newfraction']]

print(result)

代码说明

  • 通过groupby提取每个ID的唯一国家和Type集合,再用explode生成笛卡尔积组合
  • 关联去重后的国家基础信息,确保每个ID+Country的Count和fraction唯一
  • 计算每个ID的Type数量,结合fraction得到最终的newfraction值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:57:53