pandas Python:基于观测日期创建图(不作为时间序列)

mklgxw1f  于 2023-03-11  发布在  Python
关注(0)|答案(1)|浏览(101)

我有以下数据集

df
id medication_date 
1  2000-01-01
1  2000-01-04
1  2000-01-06
2  2000-04-01
2  2000-04-02
2  2000-04-03

我想首先将数据集重新整理为每例患者首次观察后的天数:

id day1 day2 day3 day4 
1  yes  no   no   yes 
2  yes  yes  yes  no

为了最终创建具有上表的图:列日期,如果是,用黑色表示,如果不是,用白色表示。
任何帮助都很感激

yv5phkfx

yv5phkfx1#

通过添加缺失天数(“无”药物)将稀疏系列(“有”药物)转换为密集系列,然后重置系列索引(2000-01-01 -〉0,2000-04-01 -〉0)。

def f(sr):
    # Create missing dates
    dti = pd.date_range(sr.min(), sr.max(), freq='D')
    # Fill the Series with 'yes' or 'no'
    return (pd.Series('yes', index=sr.tolist())
              .reindex(dti, fill_value='no')
              .reset_index(drop=True))

df['medication_date'] = pd.to_datetime(df['medication_date'])
out = (df.groupby('id')['medication_date'].apply(f).unstack(fill_value='no')
         .rename(columns=lambda x: f'day{x+1}').reset_index())

输出:

>>> out
   id day1 day2 day3 day4 day5 day6
0   1  yes   no   no  yes   no  yes
1   2  yes  yes  yes   no   no   no

更新

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

colors = ["white", "black"] 
cmap = LinearSegmentedColormap.from_list('Custom', colors, len(colors))
plt.matshow(out.set_index('id').eq('yes').astype(int), cmap=cmap)
plt.show()

相关问题