Python-эквивалент vlookup для серии и фрейма данных - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть df

  entrydate  exitdate    ddmax    
1 2012-02-15 2012-02-17    -1        
2 2012-02-18 2012-02-19    -2       
3 2012-02-20 2012-02-21    -3     
4 2012-02-22 2012-02-22    -2      
5 2012-02-24 2012-02-24    -6    

Я хочу добавить столбец, df['location']=, где результатом является DATE, при котором произошел ddmax.Эта дата находится где-то между датами входа и выхода.

Чтобы найти эту дату, мне нужно взглянуть на другую серию:

s = 
2012-02-15   -3
2012-02-16   -1
2012-02-17   -2
2012-02-18   -2
2012-02-19   -1
2012-02-20   -1
2012-02-21   -3
2012-02-22   -2
2012-02-23   -3
2012-02-24   -6
2012-02-25   -9

Так что я смотрю по номерам и беру соответствующую дату

как я могусделай это?

Я попробовал функцию карты, и pd оставил слияние, но безрезультатно ...

Ожидаемый результат:

  entrydate  exitdate    ddmax      location  
1 2012-02-15 2012-02-17    -1      2012-02-16 
2 2012-02-18 2012-02-19    -2      2012-02-18
3 2012-02-20 2012-02-21    -3      2012-02-21
4 2012-02-22 2012-02-22    -2      2012-02-22
5 2012-02-24 2012-02-24    -6      2012-02-24

1 Ответ

0 голосов
/ 22 сентября 2018

Не сказать, что это красиво, но помогает, если есть небольшие данные (что, кажется, имеет место)

def lookup(x):
    is_ = s.loc[(s.d >= x.entrydate) & (s.d <= x.exitdate), ['i', 'd']]
    return is_.loc[is_.i == x.ddmax, 'd'].iloc[0]

df['location'] = df.apply(lookup, 1)

Выходы

    entrydate   exitdate    ddmax   location
1   2012-02-15  2012-02-17  -1  2012-02-16
2   2012-02-18  2012-02-19  -2  2012-02-18
3   2012-02-20  2012-02-21  -3  2012-02-21
4   2012-02-22  2012-02-22  -2  2012-02-22
5   2012-02-24  2012-02-24  -6  2012-02-24

Код выше предполагает, что вашs - это фрейм данных, например

    d           i
0   2012-02-15  -3
1   2012-02-16  -1
2   2012-02-17  -2
3   2012-02-18  -2
4   2012-02-19  -1
5   2012-02-20  -1
6   2012-02-21  -3
7   2012-02-22  -2
8   2012-02-23  -3
9   2012-02-24  -6
10  2012-02-25  -9

Если у вас есть pd.Series, например

d
2012-02-15   -3
2012-02-16   -1
2012-02-17   -2
2012-02-18   -2
2012-02-19   -1
2012-02-20   -1
2012-02-21   -3
2012-02-22   -2
2012-02-23   -3
2012-02-24   -6
2012-02-25   -9
Name: i, dtype: int64

Функция lookup немного меняется на

def lookup(x):
    is_ = s.loc[(s.index >= x.entrydate) & (s.index <= x.exitdate)]
    return is_.loc[is_ == x.ddmax].iloc[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...