【问题标题】:Find the missing dates and fill with with the help of other dataframe查找缺失的日期并在其他数据框的帮助下填写
【发布时间】:2022-01-10 20:24:15
【问题描述】:

我有两个数据框 df1:

Country_Code    FY  Churned_month   Churned_Subscribers Resubscribed_month  Resubscribed_Subscribers
  AU           FY12   Apr-2012             1                 0                   0.0
  AU           FY12   Jul-2012             6               Jul-2012              3.0
  AU           FY13   Apr-2013             1                 0                   0.0
  AU           FY13   Aug-2013            13                 0                   0.0
  AU           FY13   Nov-2012             1                 0                   0.0
  AU           FY14   Jan-2014             1               Jun-2014              1.0
  AU           FY15   Apr-2015            45               Apr-2015             22.0
  AU           FY15   Apr-2015            45               Jun-2015              7.0
  AU           FY15   Apr-2015            45               May-2015              6.0
  AU           FY15   Aug-2015            14               Aug-2015              5.0
  AU           FY15   Feb-2015            17               Apr-2015              3.0
  AU           FY15   Feb-2015            17               Feb-2015             10.0
  AU           FY15   Feb-2015            17               Jun-2015              1.0

df2:

  start_date    end_date    fy_year_vc
  2021-09-01    2022-08-31  FY22
  2020-10-28    2021-08-31  FY21
  2019-09-01    2020-10-27  FY20
  2018-09-01    2019-08-31  FY19
  2017-09-01    2018-08-31  FY18
  2016-09-01    2017-08-31  FY17
  2015-09-01    2016-08-31  FY16
  2014-09-02    2015-08-31  FY15
  2013-09-12    2014-09-01  FY14
  2012-09-04    2013-09-11  FY13
  2011-12-12    2012-09-03  FY12
  2010-10-18    2011-12-11  FY11
  2009-10-05    2010-10-17  FY10

我想将 df2 应用于 df1 以在 Churned_month 列中查找缺失的月份

例如:对于 Churned_month Apr-2012 检查 df2 中 FY12 的结束日期,即 2012-09-03,因此缺少的月份差异是 May-2012、Jun-2012、July-2012、Aug-2012, 2012 年 9 月至 9 月,结束日期为 2012 年 9 月 3 日。因此,生成的数据框如下所示:

 Country_Code    FY  Churned_month   Churned_Subscribers Resubscribed_month  Resubscribed_Subscribers
    AU           FY12   Apr-2012             1                Apr-2012            0.0
    AU           FY12   May-2012             0                May-2012             0
    AU           FY12   June-2012            0                Jun-2012             0
    AU           FY12   Jul-2012             0                July-2012            0
    AU           FY12   Aug-2012             0                 Aug-2012            0
    AU           FY12   Sep-2012             0                Sep-2012             0
    AU           FY12   Jul-2012             6               Jul-2012              3.0
    AU           FY13   Apr-2013             1                 0                   0.0
    

我无法弄清楚如何实现这一点。我尝试将 index 设置为 Churned_month 但得到所需的输出。请帮忙

【问题讨论】:

  • 为什么FY_12 有重复的行Jul-2012 流失月份,一个有 0 个流失订阅者,一个有 6 个流失订阅者?不应该是只有 6 个流失订阅者的行吗?
  • 对于FY15 的三个Apr-2015 行应该怎么办? df2 中的开始日期和结束日期之间是否存在日期范围,在结果数据框中重复三遍?

标签: python pandas dataframe numpy datetime


【解决方案1】:

对于 df1 和 df2,如果您将日期时间列的格式标准化(并将它们设置为月初),将会更容易。

## floor each month
df1['Churned_month'] = pd.to_datetime(df1['Churned_month']).dt.to_period('M').dt.to_timestamp()
df2['start_date'] = pd.to_datetime(df2['start_date']).dt.to_period('M').dt.to_timestamp()
df2['end_date'] = pd.to_datetime(df2['end_date']).dt.to_period('M').dt.to_timestamp()

然后您可以遍历df1 的每一行,在该行的Churned_month 列与df2 中相应行的end_date 之间创建一个每月日期范围。由此,您可以在结果 DataFrame 的其他列中构造值。最后,您可以删除任何重复的行。

result = pd.DataFrame(columns=
    ['Country_Code', 'FY', 'Churned_month', 'Churned_subscribers', 'Resubscribed_month', 'Resubscribed_Subscribers']
)

for row in df1.itertuples(index=False):
    start_date = row[2]
    end_date = df2.loc[df2['fy_year_vc'] == FY, 'end_date'].max()
    new_months = pd.date_range(start_date, end_date, freq='MS')
    churned_subs, resubscribed_subs = [], []
    for month in new_months:
        if month == start_date:
            churned_subs.append(row[3])
            resubscribed_subs.append(row[5])
        else:
            churned_subs.append(0)
            resubscribed_subs.append(0)
    new_df = pd.DataFrame({
        'Country_Code': [row[0]]*len(new_months),
        'FY': [row[1]]*len(new_months),
        'Churned_month': new_months,
        'Churned_subscribers': churned_subs,
        'Resubscribed_month': new_months,
        'Resubscribed_Subscribers': resubscribed_subs
    })
    result = pd.concat([result, new_df])

result.drop_duplicates(keep='first', inplace=True)
result['Churned_month'] = result['Churned_month'].dt.strftime('%b-%Y')
result['Resubscribed_month'] = result['Resubscribed_month'].dt.strftime('%b-%Y')

这里是result DataFrame:

>>> result
  Country_Code    FY Churned_month Churned_subscribers Resubscribed_month  Resubscribed_Subscribers
0           AU  FY12      Apr-2012                   1           Apr-2012                       0.0
1           AU  FY12      May-2012                   0           May-2012                       0.0
2           AU  FY12      Jun-2012                   0           Jun-2012                       0.0
3           AU  FY12      Jul-2012                   0           Jul-2012                       0.0
4           AU  FY12      Aug-2012                   0           Aug-2012                       0.0
5           AU  FY12      Sep-2012                   0           Sep-2012                       0.0
0           AU  FY12      Jul-2012                   6           Jul-2012                       3.0
0           AU  FY13      Apr-2013                   1           Apr-2013                       0.0
1           AU  FY13      May-2013                   0           May-2013                       0.0
2           AU  FY13      Jun-2013                   0           Jun-2013                       0.0
3           AU  FY13      Jul-2013                   0           Jul-2013                       0.0
4           AU  FY13      Aug-2013                   0           Aug-2013                       0.0
5           AU  FY13      Sep-2013                   0           Sep-2013                       0.0
0           AU  FY13      Aug-2013                  13           Aug-2013                       0.0
0           AU  FY13      Nov-2012                   1           Nov-2012                       0.0
1           AU  FY13      Dec-2012                   0           Dec-2012                       0.0
2           AU  FY13      Jan-2013                   0           Jan-2013                       0.0
3           AU  FY13      Feb-2013                   0           Feb-2013                       0.0
4           AU  FY13      Mar-2013                   0           Mar-2013                       0.0
5           AU  FY13      Apr-2013                   0           Apr-2013                       0.0
0           AU  FY14      Jan-2014                   1           Jan-2014                       1.0
1           AU  FY14      Feb-2014                   0           Feb-2014                       0.0
2           AU  FY14      Mar-2014                   0           Mar-2014                       0.0
3           AU  FY14      Apr-2014                   0           Apr-2014                       0.0
4           AU  FY14      May-2014                   0           May-2014                       0.0
5           AU  FY14      Jun-2014                   0           Jun-2014                       0.0
6           AU  FY14      Jul-2014                   0           Jul-2014                       0.0
7           AU  FY14      Aug-2014                   0           Aug-2014                       0.0
8           AU  FY14      Sep-2014                   0           Sep-2014                       0.0
0           AU  FY15      Apr-2015                  45           Apr-2015                      22.0
1           AU  FY15      May-2015                   0           May-2015                       0.0
2           AU  FY15      Jun-2015                   0           Jun-2015                       0.0
3           AU  FY15      Jul-2015                   0           Jul-2015                       0.0
4           AU  FY15      Aug-2015                   0           Aug-2015                       0.0
0           AU  FY15      Apr-2015                  45           Apr-2015                       7.0
0           AU  FY15      Apr-2015                  45           Apr-2015                       6.0
0           AU  FY15      Aug-2015                  14           Aug-2015                       5.0
0           AU  FY15      Feb-2015                  17           Feb-2015                       3.0
1           AU  FY15      Mar-2015                   0           Mar-2015                       0.0
2           AU  FY15      Apr-2015                   0           Apr-2015                       0.0
0           AU  FY15      Feb-2015                  17           Feb-2015                      10.0
0           AU  FY15      Feb-2015                  17           Feb-2015                       1.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2020-12-29
    • 2020-09-08
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多