Подсчитайте, сколько строк имеют дату в пределах диапазона дат каждой строки для каждого идентификатора панд - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть набор данных, где у каждой строки есть диапазон дат и значение ID.

Я хочу знать для каждой строки, сколько других строк (имеющих одинаковые ID) имеютdate1 в пределах диапазона дат в этой строке.

Вот что я попробовал:

import random
import string

test1 = pd.DataFrame({
    'ID':[''.join(random.choice(string.ascii_letters[0:4]) for _ in range(3)) for n in range(100)],
    'date1':[pd.to_datetime(random.choice(['01-01-2018','05-01-2018','06-01-2018','08-01-2018','09-01-2018'])) + pd.DateOffset(int(np.random.randint(0, 100, 1))) for n in range(100)],
    'date2':[pd.to_datetime(random.choice(['06-01-2018','08-01-2018','09-01-2018'])) + pd.DateOffset(int(np.random.randint(201, 300, 1))) for n in range(100)]
})


count = []
test1['date2'] = test1['date2'] - pd.to_timedelta(1, unit='d')
for name, group in test1.groupby('ID'):
    df = group.loc[:,['date1','date2']].copy().stack().reset_index(name='c').set_index('c')
    df['count'] = df.groupby('level_0')...(I get stuck here)
    count = count.append(df['count'].to_list())

Затем я застреваю здесь, как определить, сколько других date1 's находятся в каждом диапазоне дат.

Таким образом, конечный результат должен быть подсчетом для каждой строки того, сколько других строк с таким же ID имели date1 в этом диапазоне дат.

1 Ответ

0 голосов
/ 27 ноября 2018

.merge DataFrame с собой на ID.Затем сравните, если date, который вы перенесли, находится между двумя датами, исключая строки, которые слились с собой.

import pandas as pd

m = test1.reset_index().merge(test1[['ID', 'date1']].reset_index(), on='ID')
#   index_x   ID    date1_x      date2  index_y    date1_y
#0        0  acb 2018-10-10 2019-01-24        0 2018-10-10
#1        0  acb 2018-10-10 2019-01-24       22 2018-10-09
#2        0  acb 2018-10-10 2019-01-24       47 2018-10-19
#3       22  acb 2018-10-09 2019-03-01        0 2018-10-10
#4       22  acb 2018-10-09 2019-03-01       22 2018-10-09

m['to_count'] = m.date1_y.ge(m.date1_x) & m.date1_y.le(m.date2) & (m.index_x != m.index_y)
m.groupby('index_x').to_count.sum()
#index_x
#0     1.0
#1     0.0
#2     2.0
#3     0.0
#     ... 
#97    1.0
#98    3.0
#99    1.0

Поскольку это основано на исходном индексе, вы можете присвоить его обратно с помощью test1['other_date1_between'] = m.groupby('index_x').to_count.sum().

print(test1.sort_values('ID').head(5))

     ID      date1      date2  other_date1_between
64  aaa 2018-07-21 2019-02-22                  0.0
86  aaa 2018-02-05 2019-05-10                  1.0
6   aab 2018-01-07 2019-04-09                  1.0
42  aab 2018-10-03 2019-03-17                  0.0
9   aac 2018-03-04 2019-02-24                  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...