为每个ID Panda计算每行的日期范围内有多少行具有日期



我有一个数据集,其中每一行都有一个日期范围和一个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的问题。

因此,最终结果应该是每行的计数,即在该日期范围内有多少其他具有相同ID的行具有date1

.mergeDataFrame自身位于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

最新更新