def test_append_to_another(self): # hits Index._concat fst = Index(["a", "b"]) snd = CategoricalIndex(["d", "e"]) result = fst.append(snd) expected = Index(["a", "b", "d", "e"]) tm.assert_index_equal(result, expected)
def test_append_index(): idx1 = Index([1.1, 1.2, 1.3]) idx2 = pd.date_range("2011-01-01", freq="D", periods=3, tz="Asia/Tokyo") idx3 = Index(["A", "B", "C"]) midx_lv2 = MultiIndex.from_arrays([idx1, idx2]) midx_lv3 = MultiIndex.from_arrays([idx1, idx2, idx3]) result = idx1.append(midx_lv2) # see gh-7112 tz = pytz.timezone("Asia/Tokyo") expected_tuples = [ (1.1, tz.localize(datetime(2011, 1, 1))), (1.2, tz.localize(datetime(2011, 1, 2))), (1.3, tz.localize(datetime(2011, 1, 3))), ] expected = Index([1.1, 1.2, 1.3] + expected_tuples) tm.assert_index_equal(result, expected) result = midx_lv2.append(idx1) expected = Index(expected_tuples + [1.1, 1.2, 1.3]) tm.assert_index_equal(result, expected) result = midx_lv2.append(midx_lv2) expected = MultiIndex.from_arrays([idx1.append(idx1), idx2.append(idx2)]) tm.assert_index_equal(result, expected) result = midx_lv2.append(midx_lv3) tm.assert_index_equal(result, expected) result = midx_lv3.append(midx_lv2) expected = Index._simple_new( np.array( [ (1.1, tz.localize(datetime(2011, 1, 1)), "A"), (1.2, tz.localize(datetime(2011, 1, 2)), "B"), (1.3, tz.localize(datetime(2011, 1, 3)), "C"), ] + expected_tuples, dtype=object, ), None, ) tm.assert_index_equal(result, expected)
def test_append_multiple(self): index = Index(["a", "b", "c", "d", "e", "f"]) foos = [index[:2], index[2:4], index[4:]] result = foos[0].append(foos[1:]) tm.assert_index_equal(result, index) # empty result = index.append([]) tm.assert_index_equal(result, index)
def _concat_index(cls, prev_index: pd.Index, cur_index: pd.Index): if isinstance(prev_index, pd.RangeIndex) and \ isinstance(cur_index, pd.RangeIndex): # handle RangeIndex that append may generate huge amount of data # e.g. pd.RangeIndex(10_000) and pd.RangeIndex(10_000) # will generate a Int64Index full of data # for details see GH#1647 prev_stop = prev_index.start + prev_index.size * prev_index.step cur_start = cur_index.start if prev_stop == cur_start and prev_index.step == cur_index.step: # continuous RangeIndex, still return RangeIndex return prev_index.append(cur_index) else: # otherwise, return an empty index return pd.Index([], dtype=prev_index.dtype) elif isinstance(prev_index, pd.RangeIndex): return pd.Index([], prev_index.dtype).append(cur_index) elif isinstance(cur_index, pd.RangeIndex): return prev_index.append(pd.Index([], cur_index.dtype)) return prev_index.append(cur_index)
def _condition_logic(base_idx: pd.Index, sub_select_idx: pd.Index, state_idx: pd.Index, condition_idx: pd.Index, logic: str) -> pd.Index: if str(logic).upper() == 'ALL': return base_idx.intersection(condition_idx).sort_values() elif str(logic).upper() == 'ANY': return sub_select_idx.intersection(condition_idx).sort_values() elif str(logic).upper() == 'AND': return state_idx.intersection(condition_idx).sort_values() elif str(logic).upper() == 'NAND': return sub_select_idx.drop(state_idx.intersection(condition_idx)).sort_values() elif str(logic).upper() == 'OR': return state_idx.append(state_idx.union(condition_idx)).drop_duplicates().sort_values() elif str(logic).upper() == 'NOR': result = state_idx.append(state_idx.union(condition_idx)).drop_duplicates().sort_values() return sub_select_idx.drop(result) elif str(logic).upper() == 'NOT': return state_idx.difference(condition_idx) elif str(logic).upper() == 'XOR': return state_idx.union(condition_idx).difference(state_idx.intersection(condition_idx)) raise ValueError(f"The logic '{logic}' must be AND, NAND, OR, NOR, NOT, XOR ANY or ALL")
def _reindex(self): if self.wavelengths is not None: wv = Index(np.round(self.wavelengths, decimals=self.tolerance)) if self._metadata_index is not None: index = wv.append(Index(self._metadata_index)) else: index = wv try: # This could be cleaner because if the df is square this will fail. self.index = index except: self.columns = index
def test_concatlike_same_dtypes(self, item): # GH 13660 typ1, vals1 = item vals2 = vals1 vals3 = vals1 if typ1 == "category": exp_data = Categorical(list(vals1) + list(vals2)) exp_data3 = Categorical(list(vals1) + list(vals2) + list(vals3)) else: exp_data = vals1 + vals2 exp_data3 = vals1 + vals2 + vals3 # ----- Index ----- # # index.append res = Index(vals1).append(Index(vals2)) exp = Index(exp_data) tm.assert_index_equal(res, exp) # 3 elements res = Index(vals1).append([Index(vals2), Index(vals3)]) exp = Index(exp_data3) tm.assert_index_equal(res, exp) # index.append name mismatch i1 = Index(vals1, name="x") i2 = Index(vals2, name="y") res = i1.append(i2) exp = Index(exp_data) tm.assert_index_equal(res, exp) # index.append name match i1 = Index(vals1, name="x") i2 = Index(vals2, name="x") res = i1.append(i2) exp = Index(exp_data, name="x") tm.assert_index_equal(res, exp) # cannot append non-index with pytest.raises(TypeError, match="all inputs must be Index"): Index(vals1).append(vals2) with pytest.raises(TypeError, match="all inputs must be Index"): Index(vals1).append([Index(vals2), vals3]) # ----- Series ----- # # series.append res = Series(vals1)._append(Series(vals2), ignore_index=True) exp = Series(exp_data) tm.assert_series_equal(res, exp, check_index_type=True) # concat res = pd.concat([Series(vals1), Series(vals2)], ignore_index=True) tm.assert_series_equal(res, exp, check_index_type=True) # 3 elements res = Series(vals1)._append( [Series(vals2), Series(vals3)], ignore_index=True) exp = Series(exp_data3) tm.assert_series_equal(res, exp) res = pd.concat( [Series(vals1), Series(vals2), Series(vals3)], ignore_index=True, ) tm.assert_series_equal(res, exp) # name mismatch s1 = Series(vals1, name="x") s2 = Series(vals2, name="y") res = s1._append(s2, ignore_index=True) exp = Series(exp_data) tm.assert_series_equal(res, exp, check_index_type=True) res = pd.concat([s1, s2], ignore_index=True) tm.assert_series_equal(res, exp, check_index_type=True) # name match s1 = Series(vals1, name="x") s2 = Series(vals2, name="x") res = s1._append(s2, ignore_index=True) exp = Series(exp_data, name="x") tm.assert_series_equal(res, exp, check_index_type=True) res = pd.concat([s1, s2], ignore_index=True) tm.assert_series_equal(res, exp, check_index_type=True) # cannot append non-index msg = (r"cannot concatenate object of type '.+'; " "only Series and DataFrame objs are valid") with pytest.raises(TypeError, match=msg): Series(vals1)._append(vals2) with pytest.raises(TypeError, match=msg): Series(vals1)._append([Series(vals2), vals3]) with pytest.raises(TypeError, match=msg): pd.concat([Series(vals1), vals2]) with pytest.raises(TypeError, match=msg): pd.concat([Series(vals1), Series(vals2), vals3])