+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

我如何获得第一个类型为A的注册表和第一个类型为B的注册表并将其移至单行

发布于2020-07-26 18:24     阅读(1022)     评论(0)     点赞(23)     收藏(5)


我正在尝试使用python和pandas获取类型为A或B的第一个注册表以及类型为C或D的第一个注册表,并将其移至单行。我想要每个ID。

我将通过此示例案例轻松演示

Id,type,Datetime 1, A, 2018-01-01 1, I, 2018-01-02 1, I, 2018-01-03 1, C, 2018-01-04 2, I, 2018-01-01 2, B, 2018-01-02 2, J, 2018-01-03 2, K, 2018-01-04 2, D, 2018-01-05 2, C, 2018-01-06 3, A, 2018-01-03 3, D, 2018-01-09 4, A, 2018-01-03 4, D, 2018-01-05 4, C, 2018-01-04

我希望处理的结果是

Id, ProcessEvent, ProcessDate, DispatchedEvent, DispatchedDate 1, A, 2018-01-01, C, 2018-01-04 2, B, 2018-01-01, D, 2018-01-05 3, A, 2018-01-03, D, 2018-01-09 4, A, 2018-01-03, C, 2018-01-04

我目前正在尝试在Databricks集群中使用python和pandas进行此操作,但我正在接受其他想法,我需要在总共达到TB的文件中做到这一点,因此它是一个大数据集,因此必须考虑速度而且我无法将整个数据集存储在内存中。


解决方案


首先按isin过滤boolean indexingdrop_duplicates按每列删除重复项Id,并将其设置为索引和rename列名:

df['Datetime'] = pd.to_datetime(df['Datetime'])
df = df.sort_values(['Id','Datetime'])

df1 = (df[df['type'].isin(['A','B'])]
          .drop_duplicates('Id')
          .set_index('Id')
          .rename(columns={'type':'ProcessEvent','Datetime':'ProcessDate'}))
df2 = (df[df['type'].isin(['C','D'])]
          .drop_duplicates('Id')
          .set_index('Id')
          .rename(columns={'type':'DispatchedEvent','Datetime':'DispatchedDate'}))

最后concat一起:

df = pd.concat([df1, df2], axis=1).reset_index()
print (df)
   Id ProcessEvent ProcessDate DispatchedEvent DispatchedDate
0   1            A  2018-01-01               C     2018-01-04
1   2            B  2018-01-02               D     2018-01-05
2   3            A  2018-01-03               D     2018-01-09
3   4            A  2018-01-03               C     2018-01-04


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/465188/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)