首页 > 解决方案 > 根据 Pandas 中的多个参数计算覆盖月数

问题描述

当患者被某些产品覆盖时,我需要用 1 标记月份。一剂可覆盖 1 个月。我也想看看覆盖面的差距。

另一个细节是数量也可能会影响几个月的覆盖率。假设数量为 2,则患者将获得未来 2 个月的承保。

现在我使用 df.loc,它适用于第一剂,但我无法思考如何计算这些覆盖率的差距。


df = pd.DataFrame({'patient':['1','2','3','4','5','6','7'], 'dose1':['A','B','B','A','C','C','C'],
                  'qty1':[1,2,1,4,1,3,4],
                  'days_since_last_dose1':[0,0,0,0,0,0,0],
                  'dose2':['B','A','B','A','C','B','C'],
                  'qty2':[1,2,1,4,1,3,4],
                  'days_since_last_dose2':[23,56,120,43,30,15,60],
                  'dose3':['B','B','B','A','A','C','B'],
                  'qty3':[3,1,1,2,1,3,4],
                  'days_since_last_dose3':[44,22,67,150,76,32,21], 'M1':[0,0,0,0,0,0,0], 'M2':[0,0,0,0,0,0,0], 'M3':[0,0,0,0,0,0,0], 'M4':[0,0,0,0,0,0,0], 'M5':[0,0,0,0,0,0,0], 'M6':[0,0,0,0,0,0,0], 'M7':[0,0,0,0,0,0,0], 'M8':[0,0,0,0,0,0,0], 'M9':[0,0,0,0,0,0,0], 'M10':[0,0,0,0,0,0,0], 'M11':[0,0,0,0,0,0,0], 'M12':[0,0,0,0,0,0,0]})

prod_1 = ['A']
prod_2 = ['B']
prod_3 = ['C']

df.loc[(df['dose1'].isin(prod_1)) & (df['qty']==1), ('MONTH1')] = 1

例如,患者获得了 Dose_1 (qty=1),这让他得到了 30 天的保险,并在 120 天后回来接受 Dose_2 (qty=2)。现在它应该表示为:

M1 = 1,M2 = 0,M3 = 0,M4 = 0,M5 = 1(患者在第一次给药后 120 天回来+双倍数量),M6 = 1,M7 = 0,M8 = 0 等等。

标签: python-3.xpandas

解决方案


欢迎来到stackoverflow,

for i in range(len(df['patient'])): #for loop to separate each patient in a separate dict
    newdict={}
    for k,v in df.items():
        newdict[str(k)]=v[i]
    data.append(newdict)

for log in data: # for loop to add up the total quantities and assign months to 1 
    for dose in range(log['qty1']+log['qty2']+log['qty3']):
        log[f'M{dose+1}']=1





df = pd.DataFrame.from_dict(data)
df = df.to_csv('doses.csv')

我喜欢弄清楚这一点。

所以基本上我将每个患者分开,然后将数量相加,然后通过一个 for 循环将其分配给相加数量范围内的月份,我希望这就是您的目标。

编辑:

for i in range(len(df['patient'])):
    newdict={}
    for k,v in df.items():
        newdict[str(k)]=v[i]
    data.append(newdict)

for log in data:
    for dose in range(1,log['qty1']+1):
        log[f'M{dose}']=1
    gap = 1 + round((log['days_since_last_dose2']/30)+0.5)
    for dose in range(gap,(gap+log['qty2'])):
        log[f'M{dose}']+=1
    gap1 = 1 + round((log['days_since_last_dose3']/30)+0.5)+gap
    for dose in range(gap1,gap1+log['qty3']):
        log[f'M{dose}']+=1

好的,所以我找到了计算覆盖率的算法,2 表示覆盖率重叠。


推荐阅读