Создание переменной обратного отсчета с повторяющимися днями - PullRequest
0 голосов
/ 08 октября 2018

У меня есть фрейм данных 'reload', и я хотел бы создать две переменные, которые отсчитывают количество дней до промежуточных и президентских выборов (фактический день выборов будет равен 0, днем ​​ранее будет 1 и т. Д.),Все дни между выборами 2008 и 2016 годов указаны в таблице данных, однако некоторые дни включаются более одного раза.Я не могу понять, как создать счетчик, который не удваивает количество дней.

reload = pd.read_excel('master.xlsx', skiprows = 1)

Это образец данных, включающий повторяющуюся запись даты

      0        1          2008-01-02   307.0   307.0  R  D   R  198  235    0  49   
      1        2          2008-01-03   306.0   306.0  R  D   R  198  235    0  49   
      2        3          2008-01-04   305.0   305.0  R  D   R  198  235    0  49   
      3        4          2008-01-05   304.0   304.0  R  D   R  198  235    0  49   
      4        5          2008-01-06   303.0   303.0  R  D   R  198  235    0  49   
      5        6          2008-01-07   302.0   302.0  R  D   R  198  235    0  49   
      ....
      6765  6766          2017-09-25     NaN     NaN  R  R   R  246  187    0  54   
      6766  6767          2017-09-25     NaN     NaN  R  R   R  246  187    0  54   
      6767  6768          2017-09-25     NaN     NaN  R  R   R  246  187    0  54 

Две строки, у которых в качестве первых записей указано «307.0» (4-й и 5-й столбцы изслева) - переменные счетчика, которые я пытался создать.Записи NaN происходят потому, что как только я понял, что счетчик, который я сделал, не будет работать, я перестал заполнять записи.

Мой желаемый результат -

   Date  Countdown
   0  2008-01-02          8
   1  2008-01-03          7
   2  2008-01-03          7
   3  2008-01-05          6
   4  2008-01-06          5
   5  2008-01-07          4
   6  2008-01-08          3

1 Ответ

0 голосов
/ 08 октября 2018

В качестве минимального примера рассмотрим:

df = pd.DataFrame([['2008-01-02'],['2008-01-03'],['2008-01-04'],['2008-01-05'],['2008-01-05'],['2008-01-05'],['2008-01-06'],
            ['2008-01-06'],['2008-01-07'],['2008-01-08'],['2008-01-09'],['2008-01-10'],['2008-01-10'],['2008-01-11']],
            columns=['Date'])

Выход:

          Date
0   2008-01-02
1   2008-01-03
2   2008-01-04
3   2008-01-05
4   2008-01-05
5   2008-01-05
6   2008-01-06
7   2008-01-06
8   2008-01-07
9   2008-01-08
10  2008-01-09
11  2008-01-10
12  2008-01-10
13  2008-01-11

Вы можете использовать duplicated() для создания логической маски и cumsum() для выполненияобратный отсчет в обратном порядке [::-1]:

df['Countdown'] = (~df['Date'].duplicated('last'))[::-1].cumsum()-1

Дает:

          Date  Countdown
0   2008-01-02          9
1   2008-01-03          8
2   2008-01-04          7
3   2008-01-05          6
4   2008-01-05          6
5   2008-01-05          6
6   2008-01-06          5
7   2008-01-06          5
8   2008-01-07          4
9   2008-01-08          3
10  2008-01-09          2
11  2008-01-10          1
12  2008-01-10          1
13  2008-01-11          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...