熊猫:按日期接近程度过滤

时间:2020-03-09 15:26:23

标签: python pandas dataframe

我有一个像这样的框架:

     id         title       date
0  1211  jingle bells 2019-01-15
1  1212  jingle bells 2019-01-15
2  1225      tom boat 2019-06-15
3  2112      tom boat 2019-06-15
4  3122      tom boat 2017-03-15
5  1762      tom boat 2017-03-15

item的定义是:id所在的titledate相同且在id开始的70天内。如果title相距70天内,我需要date分组的d = {0: [1211,1212], 1: [1225,2112], 2: [3122,1762]} 字典。预期的结果是:

title

任何给定的id可以具有无上限的字典条目数,也可以只有一个。 itemlist = [] for i in list(df.title): dates = list(df.loc[df.title==i,'date']) if (max(dates)-min(dates)).days > 70: items = [] while len(dates)>0: extract = [i for i in dates if (i-min(dates)).days<70] items.append(list(df.loc[(df.title==i)&(df.date.isin(extract)),'id']) dates = [i for i in dates if i not in extract else: items = [list(df.loc[df.title==i,'id'])] itemlist += items d = {j:i for i in range(len(itemlist)) for j in itemlist[i]} 对于一个标题是唯一的。此刻,我做类似的事情:

item

它还不能正常工作,我正在修正错误。就是说,我觉得这是一个反复的尝试-关于如何更好地做到这一点的任何想法? 另一个可接受的输出将是数据帧列表,每个select * from ( select gam.cif_id,to_char(tran_date,'MON-YYYY'),h.part_tran_type ,h.tran_amt from CUSTOM.HTD_OCT_DEC19 H,tbaadm.gam where h.tran_date ='24-DEC-2019' and h.PSTD_FLG='Y' and h.DEL_FLG='N' and gam.cif_id='D46478329' and h.cust_id=gam.cust_id and h.rpt_code in ('20211','20212','20270','20271','20410','20420','20440','20501','20502','20504','60202') ) pivot ( count(1) as TXNCOUNT, sum(tran_amt) as TXNSUM for part_tran_type in ('D' as DEBIT,'C' as CREDIT) );一个。

1 个答案:

答案 0 :(得分:1)

我认为对数据框进行排序可以帮助您更有效地解决问题。

df = df.sort_values(['title', 'date'])

itemlist = []
counter = 0 # to get items at constant time

for title in set(df.title):
    dates = df.loc[df['title']==title].date.tolist()
    item = []
    min_date = dates[0]
    for date in dates:
        if (date-min_date).days>70: # we need a new item
            itemlist.append(item) # append original item
            item = [df.iloc[counter, 0]] # new item
            min_date = date
        else:
            item.append(df.iloc[counter, 0])
        counter += 1
    itemlist.append(item)

d = {i:j for i,j in enumerate(itemlist)}

print(d)

即使代码变得有点长,也只有两个循环(最后一个循环将list更改为dict除外),并且总共循环了n_rows时间表示它只会每行查看一次。
counter的使用是使用df.iloc,它使用位置索引(而不是诸如df.loc之类的标签或条件语句),因此使用O(1)运算速度更快。

相关问题