计算每个ID熊猫在每一行的日期范围内有多少行日期

时间:2018-11-27 19:12:46

标签: python pandas

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

1 个答案:

答案 0 :(得分:2)

.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
相关问题