将数据帧从长转换为宽,同时保留值的顺序(dtype datetime)

Posted

技术标签:

【中文标题】将数据帧从长转换为宽,同时保留值的顺序(dtype datetime)【英文标题】:Convert dataframe from long to wide while retaining order of values (dtype datetime) 【发布时间】:2019-05-30 09:59:04 【问题描述】:

我有一个名为 df 的数据框,看起来与此类似(除了与每个 Client ID 关联的 Visit Date 列中的条目数上升到 74,并且有数百个独特的 Client IDs - 我在这里简化了)。

Visit Date  Client ID
2016-05-25  C1009404
2016-06-30  C1009404
2016-07-14  C1009404
2016-07-20  C1009405
2016-08-03  C1009405
2016-08-08  C1009405
2016-08-10  C1009405
2016-08-15  C1009406
2016-08-17  C1009406
2016-08-24  C1009406

我想把它从长转宽,这样它看起来像这样:

Client ID  Visit_1     Visit_2     Visit_3     Visit_4
C1009404   2016-05-25  2016-06-30  2016-07-14
C1009405   2016-07-20  2016-08-03  2016-08-08  2016-08-10
C1009406   2016-08-15  2016-08-17  2016-08-24

我已经尝试了以下代码:

df_wide = df.groupby(['Client ID'], as_index=False).agg(lambda x: ', '.join(set(x.astype(str))))
df_wide = pd.concat([df_wide[['Client ID','ENROLLED_DT']], df_wide['VISIT_DT'].str.split(',', expand=True)], axis=1)
df_wide = df_wide.rename(columns=0: 'Visit_1', 1: 'Visit_2', 2: 'Visit_3', 3: 'Visit_4')

它产生了预期的结果,但日期不再按顺序排列。我该如何做到这一点,但要保持日期从左到右升序排列?

【问题讨论】:

也许根据客户 ID 对值进行排名,然后使用数据透视就可以了。试一试 【参考方案1】:

您可能需要创建另一个密钥来帮助pivot

df.assign(key=df.groupby('ClientID').cumcount()+1).\
    pivot('ClientID','key','VisitDate').\
      fillna('').\
        add_prefix('Visit_')
Out[152]: 
key           Visit_1     Visit_2     Visit_3     Visit_4
ClientID                                                 
C10094042  2016-05-25  2016-06-30  2016-07-14            
C10094056  2016-07-20  2016-08-03  2016-08-08  2016-08-10
C10094061  2016-08-15  2016-08-17  2016-08-24  

【讨论】:

以上是关于将数据帧从长转换为宽,同时保留值的顺序(dtype datetime)的主要内容,如果未能解决你的问题,请参考以下文章

使用熊猫将数据帧从长到宽转换-单行输出

如何将数据框从长转换为宽,索引中的值按年份分组?

在 R 中使用多个观察值从长到宽转换

R语言使用reshape函数将dataframe数据从长表变换为宽表(long format to wide format)

R语言使用tidyr包的spread函数将dataframe数据从长表变换为宽表(long format to wide format)

Mysql,重塑数据从长/高到宽