在pandas数据框中添加新的行,基于一个条件。

问题描述 投票:0回答:1

我有一个情况,我想在满足某个条件后添加一条新行。我的数据框架如下。

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的时候,我想在这之间添加一条记录,事件列单元格应该包含 "today "作为事件名称,日期列应该包含今天的日期。事件列单元格应该包含 "today "作为事件名称,日期列应该有今天的日期。

输出结果应该是这样的。

 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

我应该如何实现这个功能?

python-3.x pandas row pandas-groupby
1个回答
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. 首先将你的数据切成两个数据框,比如df1和df2。
  2. 然后使用df1.append(new_df)在最后添加新的数据框
  3. 接下来通过使用.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**
    
© www.soinside.com 2019 - 2024. All rights reserved.