我遇到的情况是要在满足特定条件后添加新行。我的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
我应该如何实现?
答案 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)
好!可能还有其他方法可以做到这一点,但是我发现的方法是这样的:
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**