我有一个像这样的框架:
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
所在的title
与date
相同且在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)
);
一个。
答案 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)运算速度更快。