熊猫:根据日期条件为每个组插入新行

时间:2020-06-01 02:40:30

标签: python pandas

我有一个如下数据框:

  Date        Group   Value   Duration
2018-01-01      A      20       30
2018-02-01      A      10       60
2018-01-01      B      15      180
2018-02-01      B      30      210
2018-03-01      B      25      238 
2018-01-01      C      10      235

在上面的df中,我们看到对于A组,最后一个日期是2018-02-01。我想插入一个Date2018-03-01的行,并复制上一行的值。因此,换句话说,对于每个组,我希望通过插入重复的行直到Date达到2018-03-01来获得相等的行数。

我得到的数据框看起来像

  Date        Group   Value   Duration
2018-01-01      A      20       30
2018-02-01      A      10       60
2018-03-01      A      10       60   <----New Row 
2018-01-01      B      15      180
2018-02-01      B      30      210
2018-03-01      B      25      238  
2018-01-01      C      10      235
2018-02-01      C      10      235  <----New Row
2018-03-01      C      10      235  <----New Row

N.B .:我们可以为新行使用0值,而不是从现有的最后一行复制。

我正在尝试通过以下代码实现以上目标,但无法进一步发展:

max_d = df.loc[df.groupby(['Group'])['Date'].idxmax()]
for k,v in df.groupby(['Group']):
   if k['Date'].max() < max_d['Date'].max():
      last_row = 0 <----or k.iloc[-1]
      last_row['Date'] = pd.DateOffset(month=1)
      k.append(last_row)

但是我收到以下错误消息:

  Traceback (most recent call last):
File "<ipython-input-6-44d0a094516e>", line 2, in <module>
  if k['Date'].max() < max_d['Date'].max():
TypeError: 'int' object is not subscriptable

我在上面的代码中缺少任何内容吗?任何线索将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用pd.MultiIndex重新索引您的df:

df["Date"] = pd.to_datetime(df["Date"])

s = pd.MultiIndex.from_product([df["Date"].unique(),df["Group"].unique()],names=["Date","Group"])

print (df.set_index(["Date","Group"]).reindex(s)
       .reset_index()
       .sort_values(["Group","Date"])
       .ffill())

        Date Group  Value  Duration
0 2018-01-01     A   20.0      30.0
3 2018-02-01     A   10.0      60.0
6 2018-03-01     A   10.0      60.0
1 2018-01-01     B   15.0     180.0
4 2018-02-01     B   30.0     210.0
7 2018-03-01     B   25.0     238.0
2 2018-01-01     C   10.0     235.0
5 2018-02-01     C   10.0     235.0
8 2018-03-01     C   10.0     235.0