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