为了账号安全,请及时绑定邮箱和手机立即绑定

从日期范围取消嵌套字段创建 DataFrame 行

从日期范围取消嵌套字段创建 DataFrame 行

杨魅力 2022-07-05 19:24:01
我有以下熊猫数据框:ID       start_date        end_date        codes         type1        2019-01-01       2019-01-05      [x, y]          A2        2019-01-01       2019-01-05      [x, y, z]       B我想要做的是为每个代码生成与两个日期之间的范围相同的行数。输出将是这样的:ID          date              codes        type1        2019-01-01            x            A1        2019-01-02            x            A1        2019-01-03            x            A1        2019-01-04            x            A1        2019-01-05            x            A1        2019-01-01            y            A1        2019-01-02            y            A1        2019-01-03            y            A1        2019-01-04            y            A1        2019-01-05            y            A2        2019-01-01            x            B2        2019-01-02            x            B.....非常感谢!
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

熊猫 > 0.25.0

#if necessary

#df['start_date']= pd.to_datetime(df['start_date'])

#df['end_date']= pd.to_datetime(df['end_date'])

new_df = (df.melt(['ID','type','codes'],value_name = 'date')

            .set_index('date')

            .groupby(['ID','type'])

            .resample('D').ffill()

            .drop(columns = 'variable')

            .explode('codes')

            .reset_index(level=[0,1],drop=True)

            .sort_values(['ID','type','codes'])

            .reset_index()

            .reindex(columns = ['ID','date','codes','type'])

         )

print(new_df)

熊猫 < 0.25.0

#if necessary

#df['start_date']= pd.to_datetime(df['start_date'])

#df['end_date']= pd.to_datetime(df['end_date'])

new_df = (df.melt(['ID','type','codes'],value_name = 'date')

            .set_index('date')

            .groupby(['ID','type'])

            .resample('D').ffill()

            .drop(columns = 'variable'))


new_df = (new_df.reindex(new_df.index.repeat(new_df.codes.str.len()))

                .assign(codes=np.concatenate(new_df.codes.values))

                .reset_index(level=[0,1],drop=True)

                .sort_values(['ID','type','codes'])

                .reset_index()

                .reindex(columns = ['ID','date','codes','type']))


print(new_df)

输出


    ID       date codes type

0    1 2019-01-01     x    A

1    1 2019-01-02     x    A

2    1 2019-01-03     x    A

3    1 2019-01-04     x    A

4    1 2019-01-05     x    A

5    1 2019-01-01     y    A

6    1 2019-01-02     y    A

7    1 2019-01-03     y    A

8    1 2019-01-04     y    A

9    1 2019-01-05     y    A

10   2 2019-01-01     x    B

11   2 2019-01-02     x    B

12   2 2019-01-03     x    B

13   2 2019-01-04     x    B

14   2 2019-01-05     x    B

15   2 2019-01-01     y    B

16   2 2019-01-02     y    B

17   2 2019-01-03     y    B

18   2 2019-01-04     y    B

19   2 2019-01-05     y    B

20   2 2019-01-01     z    B

21   2 2019-01-02     z    B

22   2 2019-01-03     z    B

23   2 2019-01-04     z    B

24   2 2019-01-05     z    B


查看完整回答
反对 回复 2022-07-05
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号