Can't shift an empty dataframe with pandas 0.14.1 and numpy 1.7.1 · Issue #8019 · pandas-dev/pandas (original) (raw)
We have some code which filters a dataframe, then shifts the result. However, this dataframe may end up being empty. In pandas 0.13, this works without problem:
In [61]: df = DataFrame(columns=['foo'])
In [62]: df.shift(-1)
Out[62]:
Empty DataFrame
Columns: [foo]
Index: []
[0 rows x 1 columns]
In [1]: from pandas import *
In [2]: df = DataFrame(columns=['foo'])
In [3]: df.shift(-1)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-6aa009807b04> in <module>()
----> 1 df.shift(-1)
/users/is/whughes/pyenvs/da497516f84bbd5b/lib/python2.7/site-packages/pandas/core/generic.pyc in shift(self, periods, freq, axis, **kwds)
3288 block_axis = self._get_block_manager_axis(axis)
3289 if freq is None and not len(kwds):
-> 3290 new_data = self._data.shift(periods=periods, axis=block_axis)
3291 else:
3292 return self.tshift(periods, freq, **kwds)
/users/is/whughes/pyenvs/da497516f84bbd5b/lib/python2.7/site-packages/pandas/core/internals.pyc in shift(self, **kwargs)
2226
2227 def shift(self, **kwargs):
-> 2228 return self.apply('shift', **kwargs)
2229
2230 def fillna(self, **kwargs):
/users/is/whughes/pyenvs/da497516f84bbd5b/lib/python2.7/site-packages/pandas/core/internals.pyc in apply(self, f, axes, filter, do_integrity_check, **kwargs)
2190 copy=align_copy)
2191
-> 2192 applied = getattr(b, f)(**kwargs)
2193
2194 if isinstance(applied, list):
/users/is/whughes/pyenvs/da497516f84bbd5b/lib/python2.7/site-packages/pandas/core/internals.pyc in shift(self, periods, axis)
789 new_values = new_values.T
790 axis = new_values.ndim - axis - 1
--> 791 new_values = np.roll(new_values, periods, axis=axis)
792 axis_indexer = [ slice(None) ] * self.ndim
793 if periods > 0:
/users/is/whughes/pyenvs/da497516f84bbd5b/lib/python2.7/site-packages/numpy/core/numeric.pyc in roll(a, shift, axis)
1145 n = a.shape[axis]
1146 reshape = False
-> 1147 shift %= n
1148 indexes = concatenate((arange(n-shift,n),arange(n-shift)))
1149 res = a.take(indexes, axis)
ZeroDivisionError: integer division or modulo by zero
The behaviour is correct with numpy 1.8 however.