# Buggy code
def _join_non_unique(self, other, how="left", return_indexers=False):
    from pandas.core.reshape.merge import _get_join_indexers

    left_idx, right_idx = _get_join_indexers(
        [self.values], [other._values], how=how, sort=True
    )

    left_idx = _ensure_platform_int(left_idx)
    right_idx = _ensure_platform_int(right_idx)

    join_index = np.asarray(self.values.take(left_idx))
    mask = left_idx == -1
    np.putmask(join_index, mask, other._values.take(right_idx))

    join_index = self._wrap_joined_index(join_index, other)

    if return_indexers:
        return join_index, left_idx, right_idx
    else:
        return join_index


# Traceback (TypeError)
TypeError                                 Traceback (most recent call last)
<ipython-input-2-c7c6bdf18c3f> in <module>()
3                      index=perindex, columns=['pnum'])
4 df2 = pd.concat([perdf, perdf])
----> 5 perdf.merge(df2, left_index=True, right_index=True, how='outer')

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\frame.py in merge(self, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator)
4720                      right_on=right_on, left_index=left_index,
4721                      right_index=right_index, sort=sort, suffixes=suffixes,
-> 4722                      copy=copy, indicator=indicator)
4723
4724     def round(self, decimals=0, *args, **kwargs):

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\reshape\merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator)
52                          right_index=right_index, sort=sort, suffixes=suffixes,
53                          copy=copy, indicator=indicator)
---> 54     return op.get_result()
55
56

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\reshape\merge.py in get_result(self)
567                 self.left, self.right)
568
--> 569         join_index, left_indexer, right_indexer = self._get_join_info()
570
571         ldata, rdata = self.left._data, self.right._data

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\reshape\merge.py in _get_join_info(self)
720             join_index, left_indexer, right_indexer = \
721                 left_ax.join(right_ax, how=self.how, return_indexers=True,
--> 722                              sort=self.sort)
723         elif self.right_index and self.how == 'left':
724             join_index, left_indexer, right_indexer = \

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexes\period.py in join(self, other, how, level, return_indexers, sort)
929         result = Int64Index.join(self, other, how=how, level=level,
930                                  return_indexers=return_indexers,
--> 931                                  sort=sort)
932
933         if return_indexers:

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexes\base.py in join(self, other, how, level, return_indexers, sort)
3044             else:
3045                 return self._join_non_unique(other, how=how,
-> 3046                                              return_indexers=return_indexers)
3047         elif self.is_monotonic and other.is_monotonic:
3048             try:

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexes\base.py in _join_non_unique(self, other, how, return_indexers)
3125         left_idx, right_idx = _get_join_indexers([self.values],
3126                                                  [other._values], how=how,
-> 3127                                                  sort=True)
3128
3129         left_idx = _ensure_platform_int(left_idx)

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\reshape\merge.py in _get_join_indexers(left_keys, right_keys, sort, how, **kwargs)
980
981     # get left &amp; right join labels and num. of levels at each location
--> 982     llab, rlab, shape = map(list, zip(* map(fkeys, left_keys, right_keys)))
983
984     # get flat i8 keys from label lists

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\reshape\merge.py in _factorize_keys(lk, rk, sort)
1410     if sort:
1411         uniques = rizer.uniques.to_array()
-> 1412         llab, rlab = _sort_labels(uniques, llab, rlab)
1413
1414     # NA group

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\reshape\merge.py in _sort_labels(uniques, left, right)
1436     labels = np.concatenate([left, right])
1437
-> 1438     _, new_labels = algos.safe_sort(uniques, labels, na_sentinel=-1)
1439     new_labels = _ensure_int64(new_labels)
1440     new_left, new_right = new_labels[:l], new_labels[l:]

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\algorithms.py in safe_sort(values, labels, na_sentinel, assume_unique)
481     if compat.PY3 and lib.infer_dtype(values) == 'mixed-integer':
482         # unorderable in py3 if mixed str/int
--> 483         ordered = sort_mixed(values)
484     else:
485         try:

C:\Anaconda3\envs\py36\lib\site-packages\pandas\core\algorithms.py in sort_mixed(values)
474         str_pos = np.array([isinstance(x, string_types) for x in values],
475                            dtype=bool)
--> 476         nums = np.sort(values[~str_pos])
477         strs = np.sort(values[str_pos])
478         return _ensure_object(np.concatenate([nums, strs]))

C:\Anaconda3\envs\py36\lib\site-packages\numpy\core\fromnumeric.py in sort(a, axis, kind, order)
820     else:
821         a = asanyarray(a).copy(order="K")
--> 822     a.sort(axis=axis, kind=kind, order=order)
823     return a
824

pandas/_libs/period.pyx in pandas._libs.period._Period.__richcmp__ (pandas\_libs\period.c:12067)()

TypeError: Cannot compare type 'Period' with type 'int'

# Fixed code
def _join_non_unique(self, other, how="left", return_indexers=False):
    from pandas.core.reshape.merge import _get_join_indexers

    left_idx, right_idx = _get_join_indexers(
        [self._values], [other._values], how=how, sort=True
    )

    left_idx = _ensure_platform_int(left_idx)
    right_idx = _ensure_platform_int(right_idx)

    join_index = np.asarray(self._values.take(left_idx))
    mask = left_idx == -1
    np.putmask(join_index, mask, other._values.take(right_idx))

    join_index = self._wrap_joined_index(join_index, other)

    if return_indexers:
        return join_index, left_idx, right_idx
    else:
        return join_index