处理pandas透视表重复索引报错:除去重外还有其他方法吗?
处理尿检数据集重塑与合并的方案
你的核心问题是:df_pivot是每个Id Richiesta一行的宽表,而原df是请求对应多行的长表,直接合并会导致同一请求的行被重复匹配,产生冗余数据。不需要去重的话,可以按以下步骤处理:
第一步:提取请求级唯一特征
原df中,除了检测项(Nome Analisi Elementare)和结果(Risultato),其他字段(比如患者ID、请求时间等)应该是每个Id Richiesta唯一的。用groupby提取这些唯一特征,确保每个请求只保留一行:# 按请求ID分组,提取每个组的第一个值(同一请求下这些字段值一致) df_request_features = df.groupby('Id Richiesta').first().reset_index() # 移除已经在pivot表里的检测项和结果列 df_request_features = df_request_features.drop(columns=['Nome Analisi Elementare', 'Risultato'])第二步:合并宽表与请求特征表
把你生成的df_pivot和上面的df_request_features合并,得到包含所有请求级特征+检测项宽表的数据集:df_combined = pd.merge(df_pivot, df_request_features, how='left', on='Id Richiesta')第三步:合并带"long result"的数据集
最后再和从医院软件导出的、已按Id Richiesta重塑的DataFrame(假设叫df_long_result)合并:df_final = pd.merge(df_combined, df_long_result, how='left', on='Id Richiesta')
特殊情况处理
如果原df中存在同一请求下,某些非检测项字段有不同值的情况(比如同一请求有多次记录),可以用agg()指定每个字段的聚合逻辑:
df_request_features = df.groupby('Id Richiesta').agg({ 'PatientID': 'first', # 患者ID取第一条记录 'RequestTime': 'max', # 请求时间取最晚的 # 其他字段按需设置聚合方式,比如'last'、'mean'等 }).reset_index()
另外,如果你担心同一请求下有重复的检测项记录,可以用pivot_table替代pivot,指定聚合函数处理重复值:
df_pivot = df.pivot_table( index='Id Richiesta', columns='Nome Analisi Elementare', values='Risultato', aggfunc='first' # 重复检测项取第一个结果,也可以用'mean'等 ).reset_index()
内容的提问来源于stack exchange,提问作者Riccardo Lucis
相关产品推荐
相关产品推荐

