Длины серий не совпадают для np.where - PullRequest
1 голос
/ 14 февраля 2020

У меня есть фрейм данных MSYs_init, который содержит существующий столбец «Дата начала» с около 250 значениями. Я хочу взять год из дат этого столбца и сопоставить его с годом в серии дат начала гранта. Пожалуйста, смотрите ниже, так как я считаю, что я слишком усложнил вещи и не могу найти решение через Google-fu.

MSYs_init['Start Date'] = pd.to_datetime(MSYs_init['Start Date'], errors='coerce')
VISTAMbrStartYr = pd.DatetimeIndex(MSYs_init['Start Date']).year


VISTAGrantYrStarts = pd.Series(['2020, 8, 17','2019, 8, 18', '2018, 8, 19', '2017, 9, 17'])
VISTAGrantYrStarts = pd.to_datetime(VISTAGrantYrStarts, errors='coerce')
VISTAGrantYr = pd.DatetimeIndex(VISTAGrantYrStarts).year  

MSYs_init['VISTA Grant Year'] = np.where(VISTAMbrStartYr == VISTAGrantYr, VISTAGrantYrStarts, np.nan)

Это моя ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-129-27a1a1454145> in <module>
     12 VISTAGrantYr = pd.DatetimeIndex(VISTAGrantYrStarts).year
     13 
---> 14 MSYs_init['Mbr Starting Grant Yr'] = np.where((VISTAMbrStartYr == VISTAGrantYr) &
     15                                               (VISTAMbrStartMoDay >= VISTAGrantYrStartMoDay),
     16                                               VISTAMbrStartYr,VISTAMbrStartYr-1) 

~\anaconda3\envs\PythonData\lib\site-packages\pandas\core\indexes\base.py in cmp_method(self, other)
    100         if isinstance(other, (np.ndarray, Index, ABCSeries)):
    101             if other.ndim > 0 and len(self) != len(other):
--> 102                 raise ValueError("Lengths must match to compare")
    103 
    104         if is_object_dtype(self) and not isinstance(self, ABCMultiIndex):

ValueError: Lengths must match to compare

1 Ответ

0 голосов
/ 14 февраля 2020

Если я правильно понимаю, то, что вы пытаетесь достичь, можно сделать с помощью следующего:

MSYs_init['Start Date'] = pd.to_datetime(MSYs_init['Start Date'], errors='coerce')
VISTAGrantYrStarts = pd.to_datetime(VISTAGrantYrStarts, errors='coerce')
VISTAGrantYr = VISTAGrantYrStarts.year
MSYs_init['VISTA Grand Year'] = np.where(MSYs_init['Start Date'].dt.year.isin(VISTAGrantYr),
                                         MSYs_init['Start Date'].dt.year,
                                         np.nan)

Рабочий пример:

import pandas as pd
import numpy as np
df=pd.DataFrame({'index':[0,1,2,3],
                 'dates':['2019-02-20','2019-02-21','2020-02-21','2021-02-20']})
df['dates'] = pd.to_datetime(df['dates'],errors='coerce')
aux = pd.to_datetime(['2017-02-20','2018-02-21','2019-02-21','2019-02-20'],errors='coerce').year
df['dates_2'] = np.where(df['dates'].dt.year.isin(aux),df['dates'].dt.year,np.nan)

Вывод:

   index      dates  dates_2
0      0 2019-02-20   2019.0
1      1 2019-02-21   2019.0
2      2 2020-02-21      NaN
3      3 2021-02-20      NaN

@ Celius, мне нужно, чтобы он возвращал VISTAGrantYrStarts, а не «Дата начала», и поэтому, когда я пытаюсь это сделать, он не работает.

MSYs_init['Start Date'] = pd.to_datetime(MSYs_init['Start Date'],errors='coerce')
GrantStarts = pd.to_datetime(['2017-02-20','2018-02-21','2019-02-21','2019-02-20'],errors='coerce').year
MSYs_init['Mbr Grant Start'] = np.where(MSYs_init['Start Date'].dt.year.isin(GrantStarts),GrantStarts.dt.year,np.nan)
MSYs_init.head(50)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-71-52fd06b959bf> in <module>
      1 MSYs_init['Start Date'] = pd.to_datetime(MSYs_init['Start Date'],errors='coerce')
      2 GrantStarts = pd.to_datetime(['2017-02-20','2018-02-21','2019-02-21','2019-02-20'],errors='coerce').year
----> 3 MSYs_init['Mbr Grant Start'] = np.where(MSYs_init['Start Date'].dt.year.isin(GrantStarts),GrantStarts.dt.year,np.nan)
      4 MSYs_init.head(50)

AttributeError: 'Int64Index' object has no attribute 'dt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...