Как рассчитать количество дат в течение года после даты в панд

#python #pandas

Вопрос:

У меня есть следующий фрейм данных, и мне нужно рассчитать количество дат посещения скорой помощи со счетом 1, которые приходятся на один год после фенедата для этого фенедата для данного субъекта. Таким образом, в основном phenevisit 003v1 имеет 2 даты в течение года 23.11.05 со счетом 1, которые равны 5/5/06 и 8/5/06, поэтому его оценка будет 2 и так далее для других phenevisits.

 PheneVisit  PheneDate   Score   ER Date    SubjectID
                N/A     0       10/25/05   phchp003
phchp003v1  11/23/05    0                  phchp003
                N/A     1       5/5/06     phchp003
phchp003v2  5/10/06     0                  phchp003
                N/A     0       6/22/06    phchp003
                N/A     1       8/5/06     phchp003
phchp003v4  2/7/14      0                  phchp003
                N/A     1       10/13/14   phchp003
                N/A     0       2/15/15    phchp003
                N/A     1       8/14/15    phchp003
phchp004v2  4/27/12     0                  phchp004
phchp004v3  8/15/12     0                  phchp004
                N/A     1       5/18/13    phchp004
                N/A     0       6/21/13    phchp004
phchp004v4  6/3/15      0                  phchp004
                N/A     0       8/27/15    phchp004
                N/A     1       9/3/15     phchp004
                N/A     1       8/22/16    phchp004
                N/A     1       11/19/16   phchp004
phchp005v1  2/8/06      0                  phchp005
                N/A     1       3/24/06    phchp005
                N/A     1       4/16/06    phchp005
                N/A     1       4/25/06    phchp005
                N/A     1       5/18/06    phchp005
                N/A     0       5/25/06    phchp005
                N/A     0       6/2/06     phchp005

 

Я ищу, чтобы получить эту колонку для данных феневизитов по каждому предмету:

 PheneVisit  First Year Hosp
            0
phchp003v1  2
            0
phchp003v2  2
            0
            0
phchp003v4  1
            0
            0
            0
phchp004v2  0
phchp004v3  2
            0
            0
phchp004v4  2
            0
            0
            0
            0
phchp005v1  4
 

Дай мне знать, если я смогу что-нибудь прояснить, спасибо.

Ответ №1:

попробуйте это:

 import pandas as pd
import numpy as np
from io import StringIO

inputtxt = StringIO("""
PheneVisit  PheneDate   Score   ER Date    SubjectID
N/A             N/A     0       10/25/05   phchp003
phchp003v1  11/23/05    0       N/A         phchp003
N/A             N/A     1       5/5/06     phchp003
phchp003v2  5/10/06     0       N/A        phchp003
N/A             N/A     0       6/22/06    phchp003
N/A             N/A     1       8/5/06     phchp003
phchp003v4  2/7/14      0       N/A        phchp003
N/A             N/A     1       10/13/14   phchp003
N/A             N/A     0       2/15/15    phchp003
N/A             N/A     1       8/14/15    phchp003
phchp004v2  4/27/12     0       N/A        phchp004
phchp004v3  8/15/12     0       N/A        phchp004
N/A             N/A     1       5/18/13    phchp004
N/A             N/A     0       6/21/13    phchp004
phchp004v4  6/3/15      0       N/A        phchp004
N/A             N/A     0       8/27/15    phchp004
N/A             N/A     1       9/3/15     phchp004
N/A             N/A     1       8/22/16    phchp004
N/A             N/A     1       11/19/16   phchp004
phchp005v1  2/8/06      0       N/A        phchp005
N/A             N/A     1       3/24/06    phchp005
N/A             N/A     1       4/16/06    phchp005
N/A             N/A     1       4/25/06    phchp005
N/A             N/A     1       5/18/06    phchp005
N/A             N/A     0       5/25/06    phchp005
N/A             N/A     0       6/2/06     phchp005
""")

df = pd.read_csv(inputtxt, sep='ss ', engine='python')

df['PheneDate'] = pd.to_datetime(df['PheneDate'], format='%m/%d/%y')

df['ER Date'] = pd.to_datetime(df['ER Date'], format='%m/%d/%y')

df['pi'] = pd.IntervalIndex.from_arrays(df['PheneDate'], df['PheneDate']   pd.DateOffset(years=1))
df
def f(x):
    x = x.set_index('pi')
    x['Number of First Year'] = np.sum(np.vstack([x.index.contains(i) for i in x.loc[x['Score'] == 1, 'ER Date']]), 0)
    return x.reset_index(drop=True)

df.groupby('SubjectID').apply(f).groupby('PheneVisit')['Number of First Year'].transform('sum')
 

Выход:

 SubjectID   
phchp003   0    NaN
           1    2.0
           2    NaN
           3    1.0
           4    NaN
           5    NaN
           6    1.0
           7    NaN
           8    NaN
           9    NaN
phchp004   0    0.0
           1    1.0
           2    NaN
           3    NaN
           4    1.0
           5    NaN
           6    NaN
           7    NaN
           8    NaN
phchp005   0    4.0
           1    NaN
           2    NaN
           3    NaN
           4    NaN
           5    NaN
           6    NaN
Name: Number of First Year, dtype: float64
 

Комментарии:

1.Я получаю эту ошибку при попытке запустить это: ValueError: need at least one array to concatenate, tracing back to this: df.groupby('SubjectID').apply(f).groupby('PheneVisit')['Number of First Year'].transform('sum')

2. hrm.. Похоже, у вас могут отсутствовать какие-то данные или данные без совпадений. Посмотрите, можете ли вы создать набор данных, который дублируется. Используйте мой код для тестирования и создания проблем.