pandas如何基于ID将DataFrame特征计数合并到另一DataFrame
解决方案
直接用「特征计数宽表转换+左连接」即可实现,步骤如下:
- 第一步:将特征表转换为以患者ID为行、特征类别为列的宽表,单元格值为对应特征的计数
- 第二步:以人口统计表为左表做左连接,保留所有人口统计表中的患者(包括无特征记录的ID=13的患者)
- 第三步:填充缺失的计数为0,调整列顺序匹配预期结果
完整可运行代码
import pandas as pd # 1. 加载你已有的两张表(示例数据构造部分可直接跳过) demographics = { 'PatientID': [10, 11, 12, 13], 'DOB': ['1971-10-23', '1969-06-18', '1973-04-20', '1971-05-31'], 'Sex': ['M', 'M', 'F', 'M'], 'Flag': [0, 1, 0, 0] } demographics = pd.DataFrame(demographics) demographics['DOB'] = pd.to_datetime(demographics['DOB']) features = { 'PatientID': [10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12], 'Feature': ['A', 'B', 'A', 'A', 'C', 'B', 'C', 'A', 'B', 'B', 'A', 'C', 'D', 'A', 'B', 'C', 'C', 'D', 'D', 'D', 'B', 'C', 'C', 'C', 'B', 'B', 'C'], } features = pd.DataFrame(features) # 2. 统计各患者不同特征的计数,转为宽表,二选一即可 # 写法1:crosstab写法,最简洁 feature_counts = pd.crosstab( index=features['PatientID'], columns=features['Feature'] ).add_prefix('Feature_').reset_index() # 写法2:groupby+unstack写法,效果和上面完全一致 # feature_counts = features.groupby(['PatientID', 'Feature']).size().unstack(fill_value=0).add_prefix('Feature_').reset_index() # 3. 左连接到人口统计表,保证不丢失无特征记录的患者 result = demographics.merge(feature_counts, on='PatientID', how='left') # 4. 缺失计数填0,调整列顺序和预期对齐 feature_cols = ['Feature_A', 'Feature_B', 'Feature_C', 'Feature_D'] result[feature_cols] = result[feature_cols].fillna(0).astype(int) result = result[['PatientID', 'DOB', 'Feature_A', 'Feature_B', 'Feature_C', 'Feature_D', 'Sex', 'Flag']]
结果验证
执行print(result)即可得到和预期完全一致的输出:
PatientID DOB Feature_A Feature_B Feature_C Feature_D Sex Flag 0 10 1971-10-23 3 2 2 0 M 0 1 11 1969-06-18 3 3 3 1 M 1 2 12 1973-04-20 0 3 4 3 F 0 3 13 1971-05-31 0 0 0 0 M 0
说明:左连接会自动保留左表(人口统计表)的所有患者记录,没有对应特征数据的患者在特征列会生成空值,填充为0即可符合要求。
内容的提问来源于stack exchange,提问作者shaun
相关产品推荐
相关产品推荐

