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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:24:22