【问题标题】:Pandas merge on DatetimeIndex TypeError: object of type 'NoneType' has no len()Pandas 在 DatetimeIndex TypeError 上合并:“NoneType”类型的对象没有 len()
【发布时间】:2016-11-11 23:52:29
【问题描述】:

举个非常简单的例子:

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)

返回错误,TypeError: 'NoneType' 类型的对象没有 len()。如果我想在索引上合并这两个 DataFrame,它是相同的 DatetimeIndex,我是否错过了合并应该如何工作?

我正在运行 Python 2.7.12、Pandas 0.18.1 和 Numpy 1.11.1

完整的回溯是:

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    documentation 中声明:“left_on”可以是“标签或列表,或类似数组”当您传递“True”时,会出现错误。 如果您只是省略“left_on”,它似乎工作正常。

    我是不是误解了这个问题?

    也许你确实想这样做:

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

    这会导致

        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
    

    【讨论】:

    • 另外,在这些情况下,最好坚持使用join,因为它可以很好地加入重叠索引 - df1.join(df2, lsuffix='_l', rsuffix='_r')
    • 谢谢!我一定完全误读了合并文档。
    • join 似乎也比合并 %timeit df1.join(df2, lsuffix='_l', rsuffix='_r') 1000 个循环快一点,最好的 3:每个循环 468 µs 而%timeit pd.merge(df1, df2, left_index = True, right_index=True) 返回 1000 个循环,最好的 3:每个循环 485 µs循环
    猜你喜欢
    • 2018-06-11
    • 2021-03-03
    • 2015-07-30
    • 1970-01-01
    • 2021-10-21
    • 2018-08-14
    • 2016-06-06
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多