2016-11-11 3 views
0

nehmen die folgende sehr einfaches Beispiel:Pandas fusionieren auf DatetimeIndex Typeerror: Objekt des Typs ‚NoneType‘ hat keine len()

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) 

gibt den Fehler, Typeerror: Objekt des Typs ‚NoneType‘ hat keine len (). Fehle ich, wie Merge funktionieren soll, wenn ich diese zwei Datenrahmen auf dem Index zusammenführen möchte, der derselbe DatetimeIndex ist?

ich Python bin mit 2.7.12, Pandas 0.18.1 und 1.11.1 Numpy

Der vollständige Rückverfolgung ist:

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() 

Antwort

1

Im documentation es heißt: "left_on" sein kann "label oder list oder array-like" Wenn Sie "True" übergeben, kommt der Fehler. Wenn Sie einfach "left_on" weglassen, scheint es gut zu funktionieren.

Habe ich die Frage falsch verstanden?

Mabye Sie wollte eigentlich, dies zu tun:

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

, die sich auch 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 
+1

führen würde, unter diesen Umständen ist es besser, mit 'join' zu bleiben, wie es schön auf Joins überlappende Indizes - 'df1.join (df2, lsuffix = '_ l', rsuffix = '_ r')' –

+0

Vielen Dank! Ich muss die Dokumentation für die Zusammenführung komplett falsch gelesen haben. –

+1

'join' scheint auch damit marginal schneller zu sein als '% time it df1.join (df2, lsuffix =' _ l ', rsuffix =' _ r ')' 1000 Schleifen, best of 3: 468 μs pro Schleife und '% timeit pd.merge (df1, df2, left_index = True, right_index = True) 'liefert 1000 Schleifen, das beste von 3: 485 μs pro Schleife –

Verwandte Themen