import pandas as pd
import datetime
# 读取表A和表B的数据
table_a = pd.read_excel("C:/Users/汝汝/Desktop/体征/2012年体征(整理).xlsx")
table_b = pd.read_excel("C:/Users/汝汝/Desktop/基本信息/2012年住院.xlsx")
# 按病人ID对表A进行分组,并按时间排序
table_a['检查日期'] = pd.to_datetime(table_a['检查日期'])
df_a_grouped = table_a.sort_values(by='检查日期').groupby('PATIENT_ID')
# 创建空的DataFrame用于保存合并结果
combined_data = pd.DataFrame()
# 遍历表B的数据
for index, row in table_b.iterrows():
# 在表A中找到其病人ID对应的分组,并进行二分查找,找到表A中最靠近当前行数据时间的体征
df_a_current = df_a_grouped.get_group(row['PATIENT_ID']) # 表A数据子集
df_a_current = df_a_current.reset_index(drop=True)
diagnosis_date_str = row['诊断日期'].strftime('%Y-%m-%d %H:%M:%S')
df_a_closest = df_a_current.iloc[
(df_a_current['检查日期'] - datetime.datetime.strptime(diagnosis_date_str, '%Y-%m-%d %H:%M:%S')).abs().argsort()[0]
]
# 将表B中的数据和找到的表A中的体征进行合并,并追加到结果DataFrame中
combined_row = pd.concat([row, df_a_closest.to_frame().T], axis=1)
combined_data = combined_data.append(combined_row, ignore_index=True)
# 打印合并后的结果
print(combined_data)
# 将DataFrame输出为Excel文件
combined_data.to_excel('匹配数据.xlsx', index=False)
如果您想将一个病人的C表从纵向排列变为横向排列,可以使用 Pandas 库中的 transpose()
函数。
首先,将数据读入 DataFrame 中。假设数据已经保存在名为 df
的 DataFrame 中,则可以按如下方式进行转置:
df_T = df.transpose()
这将生成一个新的 DataFrame 对象 df_T
,其中病人 ID 成为行索引,而 C 表的组成部分成为列索引。如果您想对该 DataFrame 进行修改并覆盖原始 DataFrame,则可以使用 inplace=True
参数:
df.transpose(inplace=True)
或者,您也可以通过重新分配变量来达到相同的效果:
df = df.transpose()
在转置后,您可以使用 Pandas 中提供的各种函数和方法来进一步处理和分析数据,例如,您可以使用 sort_values()
函数按日期对 C 表进行排序:
df_T.sort_values(by='date', inplace=True)
此函数默认按列名排序,因此我们需要使用 by
参数指定 date
列作为排序依据。再次指定 inplace=True
参数可在原始 DataFrame 上进行修改。