熊猫:我们什么时候可以得到一个做

时间:2017-08-07 23:25:39

标签: python pandas

这是一个相当普遍的问题:我想知道df.groupby(level = 'id').agg(['count'])在什么情况下会导致以下类型错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-116-b422fc0967b1> in <module>()
----> 4 df.groupby(level = 'id', sort = False).agg(['count'])

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py in aggregate(self, func_or_funcs, *args, **kwargs)
   2798         if hasattr(func_or_funcs, '__iter__'):
   2799             ret = self._aggregate_multiple_funcs(func_or_funcs,
-> 2800                                                  (_level or 0) + 1)
   2801         else:
   2802             cyfunc = self._is_cython_func(func_or_funcs)

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py in _aggregate_multiple_funcs(self, arg, _level)
   2867             # reset the cache so that we
   2868             # only include the named selection
-> 2869             if name in self._selected_obj:
   2870                 obj = copy.copy(obj)
   2871                 obj._reset_cache()

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in __contains__(self, key)
    905     def __contains__(self, key):
    906         """True if the key is in the info axis"""
--> 907         return key in self._info_axis
    908 
    909     @property

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/multi.py in __contains__(self, key)
   1326         hash(key)
   1327         try:
-> 1328             self.get_loc(key)
   1329             return True
   1330         except LookupError:

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/multi.py in get_loc(self, key, method)
   1964 
   1965         if not isinstance(key, tuple):
-> 1966             loc = self._get_level_indexer(key, level=0)
   1967             return _maybe_to_slice(loc)
   1968 

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/multi.py in _get_level_indexer(self, key, level, indexer)
   2227         else:
   2228 
-> 2229             loc = level_index.get_loc(key)
   2230             if isinstance(loc, slice):
   2231                 return loc

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2391             key = _values_from_object(key)
   2392             try:
-> 2393                 return self._engine.get_loc(key)
   2394             except KeyError:
   2395                 return self._engine.get_loc(self._maybe_cast_indexer(key))

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5239)()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:4881)()

pandas/_libs/index.pyx in pandas._libs.index._bin_search (pandas/_libs/index.c:8637)()

TypeError: '<' not supported between instances of 'numpy.ndarray' and 'str'

我问这个是因为我有一个数据框,在某些情况下会发生此错误,但并非总是如此,例如,如果我使用df.head(n).groupby(level = 'id').agg(['count']),那么根据n我会收到此错误。例如,它可以正常运行到2523475并且从2523476失败但是我找不到这些位置的行有什么问题,它们看起来与数据帧中的所有其他行相同并且没有空值。

我认为数据肯定存在问题,但为了找到发生此错误时我需要知道的内容。

数据是这种格式的系列:

id       date      
3531364  2017-04-13    1
1550725  2017-02-21    1
1819411  2017-04-19    1
1636629  2016-12-28    1
3123152  2017-05-03    1
dtype: int64

如果重要,则日期为期间。转换to_dict()给了我这个:

{(1550725, Period('2017-02-21', 'D')): 1,
 (1636629, Period('2016-12-28', 'D')): 1,
 (1819411, Period('2017-04-19', 'D')): 1,
 (3123152, Period('2017-05-03', 'D')): 1,
 (3531364, Period('2017-04-13', 'D')): 1}

可能有助于某人诊断问题的额外位:

如果我执行aux = df.head(5)然后aux.groupby(level = 'id').agg(['count'])我收到错误,则会失败但是aux.groupby(level = 'id').count()工作正常。这也令人费解,因为原始数据帧df.head(5).groupby(level = 'id').agg(['count'])完美无缺。也许某些东西被缓存了?怎么会发生这种情况?

如果您使用此处粘贴的系列I进行尝试,它将适用于您,它将对我有用,但如果我收到错误然后获取head(5)的{​​{1}}则会失败。 ..(!)。我猜最终有些事情会导致df失败,并且某些东西在某种程度上被大熊猫缓存,但我真的不知道幕后发生了什么。

我将不胜感激任何帮助。我知道这并不容易。

0 个答案:

没有答案