Small differences in DataFrame/Panel ops
https://github.com/pandas-dev/pandas/blob/master/pandas/core/ops.py#L959

_flex_comp_method_FRAME and _comp_method_PANEL define `na_op` in a way that is _almost_ identical.  I'm wondering if the differences between them are intentional or if they can share an implementation.  The main difference after catching a `TypeError ` is a `isinstance(y, (np.ndarray, ABCSeries))` in the DataFrame version that only checks `isinstance(y, np.ndarray)` in the Panel version.  Is there a reason why Series is excluded in the Panel version?  (or why Index is excluded in either?)

```
def _flex_comp_method_FRAME(op, name, str_rep=None, default_axis='columns',
                            masker=False):
    def na_op(x, y):
       [...]
        except TypeError:
            xrav = x.ravel()
            result = np.empty(x.size, dtype=bool)
            if isinstance(y, (np.ndarray, ABCSeries)):
                yrav = y.ravel()
                mask = notna(xrav) & notna(yrav)
                result[mask] = op(np.array(list(xrav[mask])),
                                  np.array(list(yrav[mask])))
            else:
                mask = notna(xrav)
                result[mask] = op(np.array(list(xrav[mask])), y)

            if op == operator.ne:  # pragma: no cover
                np.putmask(result, ~mask, True)
            else:
                np.putmask(result, ~mask, False)
            result = result.reshape(x.shape)

        return result

[...]
def _comp_method_PANEL(op, name, str_rep=None, masker=False):
    def na_op(x, y):
        [...]
        except TypeError:
            xrav = x.ravel()
            result = np.empty(x.size, dtype=bool)
            if isinstance(y, np.ndarray):
                yrav = y.ravel()
                mask = notna(xrav) & notna(yrav)
                result[mask] = op(np.array(list(xrav[mask])),
                                  np.array(list(yrav[mask])))
            else:
                mask = notna(xrav)
                result[mask] = op(np.array(list(xrav[mask])), y)

            if op == operator.ne:  # pragma: no cover
                np.putmask(result, ~mask, True)
            else:
                np.putmask(result, ~mask, False)
            result = result.reshape(x.shape)

        return result
```