熊猫:根据条件为每个组添加行

时间:2017-09-25 06:25:15

标签: python pandas pandas-groupby

我们假设我有一个像这样的DataFrame:

         date  id  val
0  2017-01-01   1   10
1  2019-01-01   1   20
2  2017-01-01   2   50

我想按id对此数据集进行分组 对于每个组,我想为其添加一个新行,日期为1年。仅当行晚于组中的最后一个日期时才应添加此行。行的val应该与组中的最后一行相同。

决赛桌应如下所示:

         date  id  val
0  2017-01-01   1   10
1  2019-01-01   1   20
2  2017-01-01   2   50
3  2018-09-25   2   50   <-- new row

目前的代码如下。我可以获得一个掩码,显示哪些组需要附加一行,但不知道下一步该做什么。

>>> df = pd.DataFrame(data={'d': [datetime.date(2017, 1, 1), datetime.date(2019,1,1), datetime.date(2017,1,1)], 'id': [1,1,2], 'val': [10,20,50]})
>>> df = df.sort_values(by='d')
>>> future_date = (pd.datetime.now().date() + pd.DateOffset(years=1)).date()
>>> maxd = df.groupby('id')['d'].max()
>>> maxd < future_date
id
1    False
2     True
Name: d, dtype: bool

3 个答案:

答案 0 :(得分:4)

这是单程

In [3481]: def add_row(x):
      ...:     next_year = pd.to_datetime('today') + pd.DateOffset(years=1)
      ...:     if x['date'].max() < next_year:
      ...:         last_row = x.iloc[-1]
      ...:         last_row['date'] = next_year
      ...:         return x.append(last_row)
      ...:     return x
      ...:

In [3482]: df.groupby('id').apply(add_row).reset_index(drop=True)
Out[3482]:
        date  id  val
0 2017-01-01   1   10
1 2019-01-01   1   20
2 2017-01-01   2   50
3 2018-09-25   2   50

答案 1 :(得分:2)

对于max date的行,您可以idxmaxloc一起使用:

future_date = pd.to_datetime('today') + pd.DateOffset(years=1)
maxd = df.loc[df.groupby('id')['d'].idxmax()]

maxd = maxd[maxd['d'] < future_date]
maxd['d'] = future_date
print (maxd)
           d  id  val
2 2018-09-25   2   50

df = pd.concat([df, maxd]).sort_values(['id','d']).reset_index(drop=True)
print (df)
           d  id  val
0 2017-01-01   1   10
1 2019-01-01   1   20
2 2017-01-01   2   50
3 2018-09-25   2   50

答案 2 :(得分:2)

另一种查看方式,使用<div [style.visibility]="condition ? 'hidden' : 'visible'"></div> 查找每duplicated的最后一行

'id'
相关问题