Используйте GroupBy.agg
со словарем столбцов с агрегатными функциями - вы можете передать его вручную или динамически - все столбцы без perf_date
и rev
агрегируются по first
и rev
поlast
:
#if necessary
df['perf_date'] = df['perf_date'].ffill()
df = df.sort_values(['perf_date','pull_date'])
d = dict.fromkeys(df.columns.difference(['perf_date','rev']), 'first')
d['rev'] = 'last'
print (d)
{'clicks': 'first', 'conv': 'first', 'pull_date': 'first', 'rev': 'last'}
df = df.groupby('perf_date', as_index=False).agg(d).reindex(df.columns, axis=1)
print (df)
perf_date pull_date clicks conv rev
0 2019-01-21 2019-01-28 56 9 44.12
1 2019-01-22 2019-01-28 56 10 44.70
2 2019-01-23 2019-01-28 59 13 95.31
РЕДАКТИРОВАТЬ:
d = dict.fromkeys(df.columns.difference(['perf_date','rev']), 'first')
df1 = df.groupby('perf_date', as_index=False).agg(d)
s = df.groupby('perf_date')['rev'].nth(2)
df = df1.join(s, on='perf_date')
print (df)
perf_date clicks conv pull_date rev
0 2019-01-21 56 9 2019-01-28 NaN
1 2019-01-22 56 10 2019-01-28 NaN
2 2019-01-23 59 13 2019-01-28 95.31