Python 每个组的特定天数之间经过的天数

Python 每个组的特定天数之间经过的天数,python,pandas,Python,Pandas,从下面的数据框中,我想计算每年每个事件发生前的天数 lst = [['2011-02-01',''], ['2011-02-02',''], ['2011-02-03',''], ['2011-02-04','event1'], ['2011-02-05',''], ['2011-02-06','event_2'], ['2012-02-01',''], ['2012-02-02','

从下面的数据框中,我想计算每年每个事件发生前的天数

lst = [['2011-02-01',''],
        ['2011-02-02',''],
        ['2011-02-03',''],
        ['2011-02-04','event1'],
        ['2011-02-05',''],
        ['2011-02-06','event_2'],
        ['2012-02-01',''],
        ['2012-02-02',''],
        ['2012-02-03',''],
        ['2012-02-04',''],
        ['2012-02-05','event_1'],
        ['2012-02-06','event_2']]
df = pd.DataFrame(lst,columns=['date','event'])
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
所需的输出类似于以下内容:

尝试:

将numpy作为np导入 df=df。分配事件发生前的天数\u 1=None,事件发生前的天数\u 2=None 历元系数=24*60*60*10**9 对于df[年份]中的y。唯一: dfel=df.loc[df[年].eqy] dfel=dfel.iloc[:-1] dfel[days\u to_event\u 1]=np.wheredfel[event].eqevent\u 1,dfel[date].astypestr,无 dfel[days\u Un\u event\u 1]=pd.to\u datetimedfel[days\u Un\u event\u 1].ffill.bfill dfel[date] dfel[days\u Un\u event\u 2]=np.wheredfel[event]。eqevent\u 2,dfel[date]。astypestr,None dfel[days\u Un\u event\u 2]=pd.to\u datetimedfel[days\u Un\u event\u 2].ffill.bfill dfel[date] df.loc[df[year].eqy[事件1前的天数,事件2前的天数]=dfel[[事件1前的天数,事件2前的天数]].divepoch 产出:

>>>df.iloc[:,-2:] 距离事件1天距离事件2天 0 3 5 1 2 4 2 1 3 3 0 2 4 -1 1 5 -2 0 6 4 5 7 3 4 8 2 3 9 1 2 10 0 1 11 -1 0
lst = [['2011-02-01',''],
        ['2011-02-02',''],
        ['2011-02-03',''],
        ['2011-02-04','event_1'],
        ['2011-02-05',''],
        ['2011-02-06','event_2'],
        ['2012-02-01',''],
        ['2012-02-02',''],
        ['2012-02-03',''],
        ['2012-02-04',''],
        ['2012-02-05','event_1'],
        ['2012-02-06','event_2']]
df = pd.DataFrame(lst,columns=['date','event'])
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year


#### utility functions ####

def count_down(event, code):
    results = []
    i = -1
    partial = []
    for e in np.asarray(event):
        if e == code:
            partial.append(i+1)
            results.extend(partial[::-1])
            partial = []
            i = -1
        else:
            i += 1
            partial.append(i)
    results.extend(partial[::-1])
    return results

def reverse_count_down(event, code):
    results = []
    i = 0
    partial = []
    for e in np.asarray(event):
        if e == code:
            partial.append(i+1)
            results.extend(partial)
            partial = []
            i = 0
        else:
            i += 1
            partial.append(i)
    results.extend(partial)
    return results


df['days_until_event1'] = count_down(df.event, 'event_1')
df['days_until_event2'] = count_down(df.event, 'event_2')

# insert nevative values
c_down = np.asarray(reverse_count_down(df.event, 'event_1'))
substitute = np.where(df.days_until_event1>=df.days_until_event2)[0]
df.loc[substitute, 'days_until_event1'] = -c_down[substitute]
df