如何使用 python 根据每个 ID 的第一个和最后一个审阅日期列对行进行分组并向前填充

我有以下数据框:

这里Hotel_id和Chef_Id都是唯一的(都可以作为主键)。

我需要填充 Month_Year 列中缺失的行(应该在每个 id 的第一个日期和最后一个日期之间添加连续的month_year,然后向前填充其他相应的列值,我需要这样的内容:

在这里我解释了一些 id,但我需要将这个概念应用于数据框中的每个 id。

请让我知道解决方案。


@r-beginners,请找到以下数据供您参考:

Hotel_id    Month_Year      last_review_date

2400614     May-2015        March-2016

2400614     June-2015       March-2016

2400614     December-2015   March-2016

2400614     January-2016    March-2016

2400614     March-2016      March-2016

2400133     April-2016      May-2017

2400133     June-2016       May-2017

2400133     August-2016     May-2017

2400133     January-2017    May-2017

2400133     April-2017      May-2017

2400133     May-2017        May-2017

2400178     June-2015       April-2018

2400178     July-2016       April-2018

2400178     August-2016     April-2018

2400178     January-2017    April-2018

2400178     March-2017      April-2018

2400178     April-2018      April-2018


泛舟湖上清波郎朗
浏览 143回答 2
2回答

一只萌萌小番薯

GroupBy.transform与以下一起使用GroupBy.last:df['last_review_date'] = df.groupby('Hotel_id')['Month_Year'].transform('last')print (df)    Hotel_id     Month_Year last_review_date0    2400614       May-2015       March-20161    2400614      June-2015       March-20162    2400614  December-2015       March-20163    2400614   January-2016       March-20164    2400614     March-2016       March-20165    2400133     April-2016         May-20176    2400133      June-2016         May-20177    2400133    August-2016         May-20178    2400133   January-2017         May-20179    2400133     April-2017         May-201710   2400133       May-2017         May-201711   2400178      June-2015       April-201812   2400178      July-2016       April-201813   2400178    August-2016       April-201814   2400178   January-2017       April-201815   2400178     March-2017       April-201816   2400178     April-2018       April-2018另一个想法是将值转换为日期时间并返回每组的最大值:df['Month_Year'] = pd.to_datetime(df['Month_Year'], format='%B-%Y')df['last_review_date'] = df.groupby('Hotel_id')['Month_Year'].transform('max')print (df)    Hotel_id Month_Year last_review_date0    2400614 2015-05-01       2016-03-011    2400614 2015-06-01       2016-03-012    2400614 2015-12-01       2016-03-013    2400614 2016-01-01       2016-03-014    2400614 2016-03-01       2016-03-015    2400133 2016-04-01       2017-05-016    2400133 2016-06-01       2017-05-017    2400133 2016-08-01       2017-05-018    2400133 2017-01-01       2017-05-019    2400133 2017-04-01       2017-05-0110   2400133 2017-05-01       2017-05-0111   2400178 2015-06-01       2018-04-0112   2400178 2016-07-01       2018-04-0113   2400178 2016-08-01       2018-04-0114   2400178 2017-01-01       2018-04-0115   2400178 2017-03-01       2018-04-0116   2400178 2018-04-01       2018-04-01如果需要日期时间的原始格式:dates = pd.to_datetime(df['Month_Year'], format='%B-%Y')df['last_review_date'] = dates.groupby(df['Hotel_id']).transform('max').dt.strftime('%B-%Y')print (df)    Hotel_id     Month_Year last_review_date0    2400614       May-2015       March-20161    2400614      June-2015       March-20162    2400614  December-2015       March-20163    2400614   January-2016       March-20164    2400614     March-2016       March-20165    2400133     April-2016         May-20176    2400133      June-2016         May-20177    2400133    August-2016         May-20178    2400133   January-2017         May-20179    2400133     April-2017         May-201710   2400133       May-2017         May-201711   2400178      June-2015       April-201812   2400178      July-2016       April-201813   2400178    August-2016       April-201814   2400178   January-2017       April-201815   2400178     March-2017       April-201816   2400178     April-2018       April-2018编辑:如果需要添加每个组的所有现有月份日期时间,请使用:df['Month_Year'] = pd.to_datetime(df['Month_Year'], format='%B-%Y')df1 = (df.set_index('Month_Year')         .groupby('Hotel_id')         .resample('1M')         .ffill()         .reset_index(level=0, drop=True)         .reset_index())print (df1)   Month_Year  Hotel_id0  2016-04-30   24001331  2016-05-31   24001332  2016-06-30   24001333  2016-07-31   24001334  2016-08-31   24001335  2016-09-30   24001336  2016-10-31   24001337  2016-11-30   24001338  2016-12-31   24001339  2017-01-31   240013310 2017-02-28   240013311 2017-03-31   240013312 2017-04-30   240013313 2017-05-31   240013314 2015-06-30   240017815 2015-07-31   240017816 2015-08-31   240017817 2015-09-30   240017818 2015-10-31   240017819 2015-11-30   240017820 2015-12-31   240017821 2016-01-31   240017822 2016-02-29   240017823 2016-03-31   240017824 2016-04-30   240017825 2016-05-31   240017826 2016-06-30   240017827 2016-07-31   240017828 2016-08-31   240017829 2016-09-30   240017830 2016-10-31   240017831 2016-11-30   240017832 2016-12-31   240017833 2017-01-31   240017834 2017-02-28   240017835 2017-03-31   240017836 2017-04-30   240017837 2017-05-31   240017838 2017-06-30   240017839 2017-07-31   240017840 2017-08-31   240017841 2017-09-30   240017842 2017-10-31   240017843 2017-11-30   240017844 2017-12-31   240017845 2018-01-31   240017846 2018-02-28   240017847 2018-03-31   240017848 2018-04-30   240017849 2015-05-31   240061450 2015-06-30   240061451 2015-07-31   240061452 2015-08-31   240061453 2015-09-30   240061454 2015-10-31   240061455 2015-11-30   240061456 2015-12-31   240061457 2016-01-31   240061458 2016-02-29   240061459 2016-03-31   2400614

桃花长相依

我使用您作为示例数据提供的一些数据编写了代码。用于as.freq()填充缺失数据并method='ffill'确定如何填充缺失数据。如果你的完整数据有错误,你可以将这样得到的数据与原始数据结合起来。import pandas as pdimport numpy as npimport iodata = ''' Hotel_id Month_Year last_review_date2400614 May-2015 March-20162400614 June-2015 March-20162400614 December-2015 March-20162400614 January-2016 March-20162400614 March-2016 March-20162400133 April-2016 May-20172400133 June-2016 May-20172400133 August-2016 May-20172400133 January-2017 May-20172400133 April-2017 May-20172400133 May-2017 May-20172400178 June-2015 April-20182400178 July-2016 April-20182400178 August-2016 April-20182400178 January-2017 April-20182400178 March-2017 April-20182400178 April-2018 April-2018'''df = pd.read_csv(io.StringIO(data), sep='\s+')df['Month_Year'] = pd.to_datetime(df['Month_Year'], format='%B-%Y')hid = df['Hotel_id'].unique().tolist()new = pd.DataFrame()for h in hid:    tmp = df[df['Hotel_id'] == h].set_index('Month_Year').asfreq('1M', method='ffill')    new = pd.concat([new, tmp], axis=0)new    Hotel_id    last_review_dateMonth_Year      2015-05-31  2400614 March-20162015-06-30  2400614 March-20162015-07-31  2400614 March-20162015-08-31  2400614 March-20162015-09-30  2400614 March-20162015-10-31  2400614 March-20162015-11-30  2400614 March-20162015-12-31  2400614 March-20162016-01-31  2400614 March-20162016-02-29  2400614 March-20162016-04-30  2400133 May-20172016-05-31  2400133 May-20172016-06-30  2400133 May-20172016-07-31  2400133 May-20172016-08-31  2400133 May-20172016-09-30  2400133 May-20172016-10-31  2400133 May-20172016-11-30  2400133 May-20172016-12-31  2400133 May-20172017-01-31  2400133 May-20172017-02-28  2400133 May-20172017-03-31  2400133 May-20172017-04-30  2400133 May-20172015-06-30  2400178 April-20182015-07-31  2400178 April-20182015-08-31  2400178 April-20182015-09-30  2400178 April-20182015-10-31  2400178 April-20182015-11-30  2400178 April-20182015-12-31  2400178 April-20182016-01-31  2400178 April-20182016-02-29  2400178 April-20182016-03-31  2400178 April-20182016-04-30  2400178 April-20182016-05-31  2400178 April-20182016-06-30  2400178 April-20182016-07-31  2400178 April-20182016-08-31  2400178 April-20182016-09-30  2400178 April-20182016-10-31  2400178 April-20182016-11-30  2400178 April-20182016-12-31  2400178 April-20182017-01-31  2400178 April-20182017-02-28  2400178 April-20182017-03-31  2400178 April-20182017-04-30  2400178 April-20182017-05-31  2400178 April-20182017-06-30  2400178 April-20182017-07-31  2400178 April-20182017-08-31  2400178 April-20182017-09-30  2400178 April-20182017-10-31  2400178 April-20182017-11-30  2400178 April-20182017-12-31  2400178 April-20182018-01-31  2400178 April-20182018-02-28  2400178 April-20182018-03-31  2400178 April-2018
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python