标签:python-datetime pandas grouping datetime python
我有一些交易的数据框.我想根据项目和时间列的值对这些交易进行分组:目标是对彼此相差1小时以内的项目进行分组.因此,我们在下一次观察时(不在观察前一个小时之内)开始一个新组(请参阅DataFrame B中的列开始时间).
这是数据:我想将A转换为B.
A=
item time result
A 2016-04-18 13:08:25 Y
A 2016-04-18 13:57:05 N
A 2016-04-18 14:00:12 N
A 2016-04-18 23:45:50 Y
A 2016-04-20 16:53:48 Y
A 2016-04-20 17:11:47 N
B 2016-04-18 15:24:48 N
C 2016-04-23 13:20:44 N
C 2016-04-23 14:02:23 Y
B=
item start time end time Ys Ns total count
A 2016-04-18 13:08:25 2016-04-18 14:08:25 1 2 3
A 2016-04-18 23:45:50 2016-04-18 00:45:50 1 0 1
A 2016-04-20 16:53:48 2016-04-20 17:53:48 1 1 2
B 2016-04-18 15:24:48 2016-04-18 16:24:48 0 1 1
C 2016-04-23 13:20:44 2016-04-23 14:20:44 1 1 2
这是我所做的:
grouped = A.groupby('item')
A['end'] = (grouped['time'].transform(lambda grp: grp.min()+pd.Timedelta(hours=1)))
A2 = A.loc[(A['time'] <= A['end'])]
这每天给我一组:在第一次交易后1小时内进行交易.因此,我在同一天错过了其他交易,但与第一笔交易相隔1个多小时.我的奋斗是如何组织这些团体.然后,我可以使用pd.crosstab从结果列中获取所需的详细信息.
我的另一个想法是按项目和时间对A进行排序,然后逐行进行.如果时间在上一行的1小时之内,它将添加到该组,否则,它将创建一个新组.
解决方法:
1)设置一个window_end列以供以后与.groupby()一起使用,并定义.get_windows()以检查每个项目组的行是否适合当前的当前1小时窗口,或者什么也不做,并保留初始化值.适用于所有项目组:
df['window_end'] = df.time + pd.Timedelta('1H')
def get_windows(data):
window_end = data.iloc[0].window_end
for index, row in data.iloc[1:].iterrows():
if window_end > row.time:
df.loc[index, 'window_end'] = window_end
else:
window_end = row.window_end
df.groupby('item').apply(lambda x: get_windows(x))
2)使用带有.groupby()的窗口和项,并返回.value_counts()作为转置后的DataFrame,清理索引并添加总计:
df = df.groupby(['window_end', 'item']).result.apply(lambda x: x.value_counts().to_frame().T)
df = df.fillna(0).astype(int).reset_index(level=2, drop=True)
df['total'] = df.sum(axis=1)
要得到:
N Y total
window_end item
2016-04-18 14:08:25 A A 2 1 3
2016-04-18 16:24:48 B B 1 0 1
2016-04-19 00:45:50 A A 0 1 1
2016-04-20 17:53:48 A A 1 1 2
2016-04-23 14:20:44 C C 1 1 2
标签:python-datetime,pandas,grouping,datetime,python 来源: https://codeday.me/bug/20191118/2029971.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。