替换丢失的月份和使用python的date in date列

时间:2018-03-16 09:08:38

标签: python pandas date replace

我有一个带有日期列的数据框,根据年份和月份缺少部分数据。我必须在我的数据集中显示所有年份的月份,相应的列应显示为零。

我的数据框看起来像这样

$("#tag").DataTable().ajax.reload(null,false);

例如在2018年,我只有两个月的记录,但我想在相应的列中显示所有12个月的0,

我的另一个数据框看起来像这样

 Date    Churn    Churnrate  customerID
2008,01  726.0  0.542398        2763
2008,02  345.0  0.257751        1351
2012,11    NaN       NaN           6
2013,01    3.0  0.002241          24
2013,02   10.0  0.007471          34
2013,03   25.0  0.018678          73
2013,04   25.0  0.018678          75
2013,05   14.0  0.010459          61
2013,06   19.0  0.014195          69
2013,07   27.0  0.020172         103
2013,08   22.0  0.016436          79
2013,09   19.0  0.014195          70
2013,10   28.0  0.020919          83
2013,11   22.0  0.016436          78
2013,12   19.0  0.014195          75
2014,01   17.0  0.012701          63
2014,02   21.0  0.015689          55
2014,03    7.0  0.005230          66
2014,04   24.0  0.017931          86
2014,05   18.0  0.013448          90
2014,06   14.0  0.010459          50

我使用了下面给出的相同答案

Months  Retention_Rate  Customer_Count
0  2008/01        0.145916             133
1  2008/02        0.924663             762
2  2008/03        0.074544              67
3  2014/07        0.058684              45
4  2014/08        0.069786              61
5  2014/09        0.076130              64
6  2014/10        0.061856              60
7  2014/11        0.082474              69

但是这个输出中缺少了一些月份

predicted_retention_rate = predicted_retention_rate.set_index('Months')
idx =(pd.MultiIndex.from_product(predicted_retention_rate.index.str.split('/', expand=True).levels)
        .map('/'.join))

final_retention_rate_predicted = predicted_retention_rate.reindex(idx, fill_value=0).rename_axis('Months').reset_index()
print (final_retention_rate_predicted)

看看上面的数据框架,2008年包含01,02,03而不是04,05,06,2014年也是如此。我想知道我在哪里出错了。

2 个答案:

答案 0 :(得分:2)

我认为需要reindexsplit index创建的新Date MultiIndexmap join < / p>

df = df.set_index('Date')
idx =(pd.MultiIndex.from_product(df.index.str.split(',', expand=True).levels)
        .map(','.join))

df = df.reindex(idx, fill_value=0).rename_axis('Date').reset_index()
print (df.head())
      Date  Churn  Churnrate  customerID
0  2008,01  726.0   0.542398        2763
1  2008,02  345.0   0.257751        1351
2  2008,03    0.0   0.000000           0
3  2008,04    0.0   0.000000           0
4  2008,05    0.0   0.000000           0

编辑:通过Month

定义所有range(1,13)的解决方案
df = df.set_index('Months')
years = df.index.str.split('/', expand=True).levels[0]
idx = (pd.MultiIndex.from_product([years, 
                                  pd.Series(range(1, 13)).astype(str).str.zfill(2)])
        .map('/'.join))

df = df.reindex(idx, fill_value=0).rename_axis('Date').reset_index()
print (df)
       Date  Retention_Rate  Customer_Count
0   2008/01        0.145916             133
1   2008/02        0.924663             762
2   2008/03        0.074544              67
3   2008/04        0.000000               0
4   2008/05        0.000000               0
5   2008/06        0.000000               0
6   2008/07        0.000000               0
7   2008/08        0.000000               0
8   2008/09        0.000000               0
9   2008/10        0.000000               0
10  2008/11        0.000000               0
11  2008/12        0.000000               0
12  2014/01        0.000000               0
13  2014/02        0.000000               0
14  2014/03        0.000000               0
15  2014/04        0.000000               0
16  2014/05        0.000000               0
17  2014/06        0.000000               0
18  2014/07        0.058684              45
19  2014/08        0.069786              61
20  2014/09        0.076130              64
21  2014/10        0.061856              60
22  2014/11        0.082474              69
23  2014/12        0.000000               0

如果需要用零替换缺少的年份和相应的列:

print (df)
Year   Churn_Count  Churn_Rate  Customer_Count                                        
2008       1071.0    0.800149             4114
2012          0.0    0.000000                6
2013        233.0    0.174075              824
2014        101.0    0.075458              410

然后使用:

df1 = (df.set_index('Year')
        .reindex(range(2008, 2015), fill_value=0)
        .reset_index())
print (df1)
   Year  Churn_Count  Churn_Rate  Customer_Count
0  2008       1071.0    0.800149            4114
1  2009          0.0    0.000000               0
2  2010          0.0    0.000000               0
3  2011          0.0    0.000000               0
4  2012          0.0    0.000000               6
5  2013        233.0    0.174075             824
6  2014        101.0    0.075458             410

最小和最大年份reindex的更动态解决方案:

df1 = df.set_index('Year')
df1 = (df1.reindex(range(df1.index.min(), df1.index.max() + 1), fill_value=0)
          .reset_index())
print (df1)
   Year  Churn_Count  Churn_Rate  Customer_Count
0  2008       1071.0    0.800149            4114
1  2009          0.0    0.000000               0
2  2010          0.0    0.000000               0
3  2011          0.0    0.000000               0
4  2012          0.0    0.000000               6
5  2013        233.0    0.174075             824
6  2014        101.0    0.075458             410

答案 1 :(得分:1)

我认为另一个简单的方法可能是这个。

ORDER BY

如果import pandas as pd df = pd.DataFrame({"date":["2010-01", "2010-02", "2011-01"], "a": [1, 2, 3], "b":[0.2,-0.1,0.4]}) df["date"] = pd.to_datetime(df["date"]) all_dates = pd.DataFrame({"date":pd.date_range(start=df["date"].min(), end=df["date"].max(), freq="MS")}) df = pd.merge(all_dates, df, how="left", on="date").fillna(0) 是您的索引,则可以使用date.reset_index()。然后,如果您想保持相同的日期格式,只需添加.set_index()