我有一个情况,我想在满足某个条件后添加一条新行。我的数据框架如下。
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
我应该如何实现这个功能?
如果需要在每个组之间添加新行,如果有变化使用。
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
好吧!可能有一些其他的方法也做到这一点,但一个我发现是这样的。
接下来通过使用.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**