基于Type维度分解Fractional Assignation的数据集处理需求
数据集处理:基于Type维度分解fraction字段
原始数据集
| ID | Country | Count | fraction | Type |
|---|---|---|---|---|
| 1 | Austria | 10 | 0.33 | A |
| 1 | Belgium | 10 | 0.66 | B |
| 1 | Belgium | 10 | 0.66 | B |
| 2 | Czech | 15 | 0.25 | C |
| 2 | Denmark | 15 | 0.75 | C |
| 2 | Denmark | 15 | 0.75 | D |
| 2 | Denmark | 15 | 0.75 | D |
说明:fraction字段为每个ID下对应国家的占比
需求说明
需要基于Type维度对数据集进行分解,规则如下:
- 每个ID需生成「该ID下唯一国家数量 × 该ID下唯一Type数量」的行数据
- 新增
newfraction字段,计算方式为:当前国家的fraction× (该ID下唯一Type数量的倒数)
示例输出
| ID | Country | Count | fraction | Type | newfraction |
|---|---|---|---|---|---|
| 1 | Austria | 10 | 0.33 | A | 0.33*0.5 |
| 1 | Austria | 10 | 0.33 | B | 0.33*0.5 |
| 1 | Belgium | 10 | 0.66 | A | 0.66*0.5 |
| 1 | Belgium | 10 | 0.66 | B | 0.66*0.5 |
| 2 | Czech | 15 | 0.25 | C | 0.25*0.5 |
| 2 | Czech | 15 | 0.25 | D | 0.25*0.5 |
| 2 | Denmark | 15 | 0.75 | C | 0.75*0.5 |
| 2 | Denmark | 15 | 0.75 | D | 0.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
相关产品推荐
相关产品推荐

