我有一个如下数据框:
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
。我想插入一个Date
为2018-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
我在上面的代码中缺少任何内容吗?任何线索将不胜感激。
答案 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