Alexander UpUp
Alexander UpUp

Reputation: 23

Why do I get: "Length of values does not match length of index" error?

I have the following code and I'm trying to assign True to a new Column where Actual Date equals the Date in Column 'D' (Date created) and False to any other.

I'm quite new to Python so I would like to understand what I have done wrong:

def GetData():
    myList = GetFileList(TodaysDate,5)
    NewDataFrame  = pd.DataFrame()
    for x in myList:
        #The date of the actuals data is the day BEFORE it was created  
        ActualDate = getDate(x) - timedelta(days=1)

        myTempData = pd.read_csv(WSIWeatherDir + "\\" + x, parse_dates = [" date"], date_parser = DateTimeParser)

        myTempData = myTempData.replace(-99,np.nan)
        myTempData = myTempData.loc[myTempData['name'].isin(NL_WeatherStations)]
        myTempData['D'] = myTempData[' date'].dt.date

        #MyData = myTempData.sort([' date'], ascending=True)
        #print MyData

        #Select indices of the weather file where the column " date" is equal to the actual date we are looking for
        MyActualIndex = myTempData['D'] == ActualDate
        MyActualData = myTempData[MyActualIndex]


        MyExpectedIndex = myTempData.index.difference(MyActualData.index)
        MyExpectedData =  myTempData.loc[MyExpectedIndex] 

        myTempData ['Actuals'] = [True] * len(MyActualData.index)
        myTempData ['Actuals'] = [False] * len(MyExpectedData.index)

        NewDataFrame = pd.concat([NewDataFrame,myTempData])
    return NewDataFrame
print GetData()

Error

runfile('C:/Users//Desktop/NLG_TAC_Calculation/TAC_2.py', wdir='C:/Users//Desktop/NLG_TAC_Calculation')
Traceback (most recent call last):

  File "<ipython-input-4-c9c151bca95a>", line 1, in <module>
    runfile('C:/Users//Desktop/NLG_TAC_Calculation/TAC_2.py', wdir='C:/Users//Desktop/NLG_TAC_Calculation')

  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
    execfile(filename, namespace)

  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "C:/Users//Desktop/NLG_TAC_Calculation/TAC_2.py", line 117, in <module>
    print GetData()

  File "C:/Users//Desktop/NLG_TAC_Calculation/TAC_2.py", line 108, in GetData
    myTempData ['Actuals'] = [True] * len(MyActualData.index)

  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2127, in __setitem__
    self._set_item(key, value)

  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2204, in _set_item
    value = self._sanitize_column(key, value)

  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2362, in _sanitize_column
    value = _sanitize_index(value, self.index, copy=False)

  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 2579, in _sanitize_index
    raise ValueError('Length of values does not match length of '

ValueError: Length of values does not match length of index

Upvotes: 2

Views: 44015

Answers (1)

Matheus Portela
Matheus Portela

Reputation: 2470

My best guess relies in this part:

myTempData ['Actuals'] = [True] * len(MyActualData.index)
myTempData ['Actuals'] = [False] * len(MyExpectedData.index)

It first says that myTempData['Actuals'] is a column of size len(MyActualData.index) containing only True values. Next, it replaces everything by another column of size len(MyExpectedData.index) (which I expect to be different) containing False values.

You can first create a column of True values and, only then, replace False ones:

myTempData['Actuals'] = True
myTempData.iloc[MyExpectedIndex] = False

Upvotes: 8

Related Questions