Быстрый способ проверить, содержится ли одна дата в списке (python 3.8 pandas) - PullRequest
0 голосов
/ 27 января 2020

У меня есть pandas DataFrame, который содержит пару временных рядов, и его индекс представлен каждой датой этих данных временного ряда. У меня также есть список указанных c дат (с неравномерным интервалом), и моя цель - прикрепить фиктивную переменную к DataFrame так, чтобы она равнялась единице, если индекс даты в кадре данных содержится в списке указанных * 1027. * даты. Для этого я добавил столбец нулей в фрейм данных и попытался изменить его на единицу в соответствии с моей целью: l oop:

for index, row in df.iterrows():
    if index==listdate[listdate[listdate.isin({'dates': [index]})]['dates'].notna()]['dates']:
        df.loc[index,h]=1
    else:
        continue

, где index обозначает дату в фрейм данных df. Более того, I listdate - это еще один фрейм данных, который содержит только списки указанных c дат, а 'dates' - это столбец, содержащий список дат, которые я намеревался использовать. Я получаю сообщение об ошибке:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Может кто-нибудь помочь? Есть ли у кого-нибудь более эффективный способ сделать это?

Вот пример моего фрейма данных df:

             feat1 feat2  EEG  UNPPLOYiitte  CPC  PPP  FFMM
Date                                                       
2005-09-19  14.75  14.74    0             0    0    0     0
2005-09-20  14.67  14.66    0             0    0    0     0
2005-09-21  15.67  15.67    0             0    0    0     0
2005-09-22   15.6  15.59    0             0    0    0     0
2005-09-23  14.85  14.81    0             0    0    0     0

мой список дат представлен:

    UNPPLOYiitte        CPC        PPP       FFMM
0     1958-01-14 1958-01-21 1971-02-17 1978-01-18
1     1958-02-11 1958-02-25 1971-03-05 1978-03-01
2     1958-03-11 1958-03-21 1971-04-01 1978-03-22
3     1958-04-08 1958-04-23 1971-05-06 1978-04-19
4     1958-04-29 1958-05-22 1971-06-04 1978-05-17
..           ...        ...        ...        ...
712   2017-08-04        NaT        NaT        NaT
713   2017-09-01        NaT        NaT        NaT
714   2017-10-06        NaT        NaT        NaT
715   2017-11-03        NaT        NaT        NaT
716   2017-12-08        NaT        NaT        NaT

Я ожидаю получить что-то вроде этого:

             feat1 feat2  EEG  UNPPLOYiitte  CPC  PPP  FFMM
Date                                                       
2007-11-05   20.8  24.73    0             0    0    0     0
2007-11-06   20.8  23.15    0             0    0    0     0
2007-11-07  23.11  24.66    0             0    0    0     0
2007-11-08  24.21  25.36    1             0    0    0     0
2007-11-09  26.26  28.59    0             0    0    0     0
2007-11-12   25.8  27.88    0             0    0    0     0
2007-11-13  24.39   26.4    0             0    0    0     0
2007-11-14  23.91  29.39    0             0    0    0     0
2007-11-15  24.12  29.39    0             0    0    0     0
2007-11-16  23.95  29.39    0             0    0    0     0
2007-11-19  25.89  29.39    0             0    0    0     0
2007-11-20  24.23  24.18    0             0    0    0     0
2007-11-21  26.31  26.32    0             0    0    0     0
2007-11-22  25.28  25.33    0             0    0    0     0
2007-11-23  24.21  24.24    0             0    0    0     0
2007-11-26  25.36   25.6    0             0    0    0     0
2007-11-27  24.89  25.04    0             0    0    0     0
2007-11-28  22.95   23.1    0             0    0    0     0
2007-11-29  22.19  22.15    0             0    0    0     0
2007-11-30  20.43  20.17    0             0    0    0     0
2007-12-03  20.22  20.24    0             0    0    0     0
2007-12-04  21.19  21.95    0             0    0    0     0
2007-12-05  19.13  19.47    0             0    0    0     0
2007-12-06  18.95  19.34    1             0    0    0     0
2007-12-07  17.78  17.85    0             0    0    0     0

Как видите, мне удалось сделать это для колонки ЭЭГ, но не для последних трех. Столбец ЭЭГ взят из другого кадра данных, относящегося к классу object, в то время как список дат содержит метки даты:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 717 entries, 0 to 716
Data columns (total 4 columns):
UNPPLOYiitte    717 non-null datetime64[ns]
CPC             157 non-null datetime64[ns]
PPP             563 non-null datetime64[ns]
FFMM            328 non-null datetime64[ns]
dtypes: datetime64[ns](4)
...