Python 3.x 根据条件在数据帧中添加新行

Python 3.x 根据条件在数据帧中添加新行,python-3.x,pandas,row,pandas-groupby,Python 3.x,Pandas,Row,Pandas Groupby,我有一种情况,我想在满足某个条件后添加一个新行。我的dat框架如下所示: ID Event Date 1 A 2019-11-12 1 B 2019-11-13 1 C 2019-11-18 1 D 2019-11-20 2 A

我有一种情况,我想在满足某个条件后添加一个新行。我的dat框架如下所示:

ID            Event          Date
1             A              2019-11-12
1             B              2019-11-13
1             C              2019-11-18
1             D              2019-11-20
2             A              2019-11-20
2             B              2019-11-20
当ID值从1变为2时,我想在两者之间添加一行。事件列单元格应包含“今天”作为事件名称,日期列应包含今天的日期

输出应该如下所示:

 ID            Event          Date
 1             A              2019-11-12
 1             B              2019-11-13
 1             C              2019-11-18
 1             D              2019-11-20
 1             Today          2020-04-24
 2             A              2019-11-20
 2             B              2019-11-20

我应该如何做到这一点

如果需要在每个组之间追加新行,如果有更改,请使用:

df1 = (df[df['ID'].ne(df['ID'].shift(-1).ffill())]
       .assign(Event='today', 
               Date = pd.Timestamp.today().floor('d')))
print (df1)
   ID  Event       Date
3   1  today 2020-04-24
或:


然后使用排序索引值添加到原始:

df = df.append(df1).sort_index(kind='mergesort')
print (df)

   ID  Event       Date
0   1      A 2019-11-12
1   1      B 2019-11-13
2   1      C 2019-11-18
3   1      D 2019-11-20
3   1  today 2020-04-24
4   2      A 2019-11-20
5   2      B 2019-11-20

嗯!可能还有其他方法可以做到这一点,但我发现的方法如下:

  • 首先将数据分为两个数据帧。比如说df1和df2
  • 然后使用df1.append(new_df)将新的数据帧添加到末尾
  • 接下来使用重新加入它们。追加(df2)


  • ID
    列还有另一个值,如果更改,是否需要添加新行?@jezrael:是的,还有其他值,如果值从一个值更改为另一个值,则应添加新行。让我试试您的解决方案,直到不起作用为止?@jezrael:no。对于许多ID,行的位置仍然不正确。我不确定这里出了什么问题,代码似乎是正确的。我正在寻找解决这个问题的另一个主要问题,我有,如果这可以很容易地解决。你介意看看那个吗?是的。那是对的。。这是我的主要痛点,我没有看到正确的输出。需要追加的新行位于错误的位置,我不确定问题的原因。我应该如何共享我的输出以向您显示?@Django0602是索引默认值?如果不确定,请尝试
    df=df。在我的解决方案之前重置索引(drop=True)
    print (df1)
    
       ID  Event       Date
    3   1  today 2020-04-24
    
    df = df.append(df1).sort_index(kind='mergesort')
    print (df)
    
       ID  Event       Date
    0   1      A 2019-11-12
    1   1      B 2019-11-13
    2   1      C 2019-11-18
    3   1      D 2019-11-20
    3   1  today 2020-04-24
    4   2      A 2019-11-20
    5   2      B 2019-11-20
    
    import pandas as pd
    d = {'id' : [1,1,2], 'event' : ['a', 'b', 'c'], 'date':[12,21,30]}
    
    **id    event   date
    0   1   a   12
    1   1   b   21
    2   2   c   30**
    
    to_append = pd.DataFrame({'id' : [1], 'event' : ['a'], 'date':[12]})
    
    **id    event   date
    0   1   a   12**
    
    
    df = pd.DataFrame(d)
    
    df1 = df.iloc[0:2, :]
    df1 = df1.append(to_append)
    df1 = df1.append(df2)
    
    **id    event   date
     0  1   a   12
     1  1   b   21
     0  1   a   12
     2  2   c   30**