根据条件在熊猫数据框中添加新行

时间:2020-04-24 12:41:28

标签: 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              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

我应该如何实现?

2 个答案:

答案 0 :(得分:1)

如果需要更改,请在每个组之间添加新行:

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

或者:

df1 = (df.drop_duplicates('ID', keep='last')
         .iloc[:-1]
         .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

答案 1 :(得分:1)

好!可能还有其他方法可以做到这一点,但是我发现的方法是这样的:

  1. 首先将您的数据切成两个数据帧。说df1和df2
  2. 然后使用df1.append(new_df)将新的数据帧添加到末尾
  3. next使用再次重新加入它们。 df1.append(df2)

    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**