not link not link - 27 days ago 20
Python Question

Pandas merge on DatetimeIndex TypeError: object of type 'NoneType' has no len()

take the following very simple example:

import pandas as pd
import numpy as np
import datetime

base = datetime.datetime(2016, 10, 1)
date_list = [base - datetime.timedelta(days=x) for x in range(0, 100)]

df1 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'), index = date_list)
df2 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'), index = date_list)

pd.merge(df1, df2, how = 'outer', left_on = True)


returns the error, TypeError: object of type 'NoneType' has no len(). Am I missing how merge is supposed to work, if I want to merge these two DataFrames on the index, which is the same DatetimeIndex?

I am running Python 2.7.12, Pandas 0.18.1, and Numpy 1.11.1

The full traceback is:

TypeError Traceback (most recent call last)
<ipython-input-1-3174c0ff542d> in <module>()
9 df2 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'), index = date_list)
10
---> 11 pd.merge(df1, df2, how = 'outer', left_on = True)

/Users/user/anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator)
36 right_on=right_on, left_index=left_index,
37 right_index=right_index, sort=sort, suffixes=suffixes,
---> 38 copy=copy, indicator=indicator)
39 return op.get_result()
40 if __debug__:

/Users/user/anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in __init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator)
208 (self.left_join_keys,
209 self.right_join_keys,
--> 210 self.join_names) = self._get_merge_keys()
211
212 def get_result(self):

/Users/user/anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _get_merge_keys(self)
405 left_keys, right_keys
406 """
--> 407 self._validate_specification()
408
409 left_keys = []

/Users/user/anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
521 'of levels in the index of "left"')
522 self.left_on = [None] * n
--> 523 if len(self.right_on) != len(self.left_on):
524 raise ValueError("len(right_on) must equal len(left_on)")
525

TypeError: object of type 'NoneType' has no len()

Answer

In the documentation it states that: "left_on" can be "label or list, or array-like" As you are passing "True" there comes the error. If you just omitt "left_on", it seems to work fine.

Did i misunderstand the question?

Mabye you did actually want to do this:

pd.merge(df1, df2, how = 'outer', left_index = True, right_index=True)

which would result in

    A_x B_x C_x D_x A_y B_y C_y D_y
2016-10-01  99  9   89  27  2   10  63  44
2016-09-30  42  74  58  87  33  56  83  72
2016-09-29  89  41  89  94  75  66  74  17
2016-09-28  53  42  4   83  84  48  2   36
2016-09-27  81  97  1   14  86  27  49  53