Skip to content

Commit 3e515ce

Browse files
committed
FIX: Reworked the tests, removed the equal None
1 parent d494287 commit 3e515ce

File tree

2 files changed

+109
-144
lines changed

2 files changed

+109
-144
lines changed

pandas/core/index.py

+18-4
Original file line numberDiff line numberDiff line change
@@ -1368,11 +1368,18 @@ def union(self, other):
13681368
raise TypeError('Input must be iterable.')
13691369

13701370
if len(other) == 0 or self.equals(other):
1371+
if (len(other) and
1372+
hasattr(other, 'name') and not
1373+
other.name == self.name and not
1374+
other.name is None):
1375+
self.name = None
13711376
return self
13721377

13731378
other = _ensure_index(other)
13741379

13751380
if len(self) == 0:
1381+
if not other.name == self.name:
1382+
other.name = None
13761383
return other
13771384

13781385
self._assert_can_do_setop(other)
@@ -1426,7 +1433,10 @@ def union(self, other):
14261433
return self._wrap_union_result(other, result)
14271434

14281435
def _wrap_union_result(self, other, result):
1429-
name = self.name if other.name == self.name or other.name==None else None
1436+
name = None
1437+
if self.name == other.name or other.name is None:
1438+
name = self.name
1439+
14301440
return self.__class__(data=result, name=name)
14311441

14321442
def intersection(self, other):
@@ -1450,6 +1460,10 @@ def intersection(self, other):
14501460
other = _ensure_index(other)
14511461

14521462
if self.equals(other):
1463+
if (hasattr(other, 'name')
1464+
and not other.name is None
1465+
and not other.name == self.name):
1466+
self.name = None
14531467
return self
14541468

14551469
if not is_dtype_equal(self.dtype,other.dtype):
@@ -1474,7 +1488,7 @@ def intersection(self, other):
14741488
indexer = indexer[indexer != -1]
14751489

14761490
taken = self.take(indexer)
1477-
if self.name != other.name and not other.name == None:
1491+
if self.name != other.name and not other.name is None:
14781492
taken.name = None
14791493

14801494
return taken
@@ -5530,7 +5544,7 @@ def difference(self, other):
55305544
result_names = self.names
55315545
else:
55325546
result_names = None
5533-
if self.names == other.names or other.names == None:
5547+
if self.names == other.names or other.names is None:
55345548
result_names = self.names
55355549

55365550
if self.equals(other):
@@ -5627,7 +5641,7 @@ def _bounds(self):
56275641

56285642
def _wrap_joined_index(self, joined, other):
56295643
names = None
5630-
if self.names == other.names or other.names == None:
5644+
if self.names == other.names or other.names is None:
56315645
names = self.names
56325646
return MultiIndex.from_tuples(joined, names=names)
56335647

pandas/tests/test_index.py

+91-140
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
CategoricalIndex, DatetimeIndex, TimedeltaIndex, PeriodIndex)
1818
from pandas.core.index import InvalidIndexError, NumericIndex
1919
from pandas.util.testing import (assert_almost_equal, assertRaisesRegexp,
20-
assert_copy, assert_frame_equal)
20+
assert_copy)
2121
from pandas import compat
2222
from pandas.compat import long
2323

@@ -272,8 +272,8 @@ def setUp(self):
272272
)
273273
self.setup_indices()
274274

275-
def create_index(self):
276-
return Index(list('abcde'))
275+
def create_index(self, content=list('abcde'), name=None):
276+
return Index(content, name=name)
277277

278278
def test_new_axis(self):
279279
new_index = self.dateIndex[None, :]
@@ -618,154 +618,105 @@ def test_shift(self):
618618

619619
def test_union_naming_behavior(self):
620620
#9965
621-
idx_name_a = pd.Index([1,2,3], name='a')
622-
idx_name_b = pd.Index([4,5,6], name='b')
623-
idx2_name_a = pd.Index([2,9,8], name='a')
624-
625-
stridx_name_stra = pd.Index(['1','2'], name='stra')
626-
stridx_name_a = pd.Index(['1','2'], name='a')
627-
628-
idx_name_none = pd.Index(['1','2'], name=None)
629-
630-
dateindex_name_a = pd.DatetimeIndex([datetime.today()], name='a')
631-
dateindex_name_b = pd.DatetimeIndex([datetime.today()], name='b')
632-
dateindex_name_None = pd.DatetimeIndex([datetime.today()], name=None)
633-
634-
python_array = [1,2,3]
635-
numpy_array = np.array([1,2,3])
636-
637-
#index union index naming behavior
638-
self.assertEqual(idx_name_a.union(idx_name_b).name, None)
639-
self.assertEqual(idx_name_a.union(idx2_name_a).name, 'a')
640-
641-
#index union array
642-
self.assertEqual(idx_name_a.union(python_array).name, 'a')
643-
self.assertEqual(idx_name_a.union(numpy_array).name, 'a')
644-
645-
#index union index different dtype
646-
self.assertEqual(idx_name_a.union(stridx_name_a).name, 'a')
647-
self.assertEqual(idx_name_a.union(stridx_name_stra).name, None)
648-
649-
#index union index with no name
650-
self.assertEqual(idx_name_a.union(idx_name_none).name, 'a')
651-
652-
#index union dateindex
653-
self.assertEqual(idx_name_a.union(dateindex_name_a).name, 'a')
654-
self.assertEqual(idx_name_a.union(dateindex_name_b).name, None)
655-
self.assertEqual(idx_name_a.union(dateindex_name_None).name, 'a')
656-
657-
#dateindex union
658-
self.assertEqual(dateindex_name_a.union(python_array).name, 'a')
659-
self.assertEqual(dateindex_name_a.union(numpy_array).name, 'a')
660-
661-
self.assertEqual(dateindex_name_a.union(idx_name_none).name, 'a')
662-
self.assertEqual(dateindex_name_a.union(dateindex_name_b).name, None)
663-
self.assertEqual(dateindex_name_a.union(dateindex_name_None).name, 'a')
664-
self.assertEqual(dateindex_name_a.union(idx_name_a).name, 'a')
621+
self.compare_naming([1,2,3],[4,5,6],[2,5,6], func_name='union')
622+
self.compare_naming(['1','2','3'],['4','5','6'],['2','5','6'], func_name='union')
623+
self.compare_naming([1,'2',3],[4,'5','6'],[2,3,6], func_name='union')
624+
self.compare_naming([1.,2.,3.],[4.,5.,6.],[2.,3.,6.], func_name='union')
665625

666626
def test_intersection_naming_behavior(self):
667627
#9965
668-
idx_name_a = pd.Index([1,2,3], name='a')
669-
idx_name_b = pd.Index([4,5,6], name='b')
670-
idx2_name_a = pd.Index([2,9,8], name='a')
671-
672-
stridx_name_stra = pd.Index(['1','2'], name='stra')
673-
stridx_name_a = pd.Index(['1','2'], name='a')
674-
675-
idx_name_none = pd.Index(['1','2'], name=None)
676-
677-
dateindex_name_a = pd.DatetimeIndex([datetime.today()], name='a')
678-
dateindex_name_b = pd.DatetimeIndex([datetime.today()], name='b')
679-
dateindex_name_None = pd.DatetimeIndex([datetime.today()], name=None)
680-
681-
python_array = [1,2,3]
682-
numpy_array = np.array([1,2,3])
683-
684-
#index intersection index naming behavior
685-
self.assertEqual(idx_name_a.intersection(idx_name_b).name, None)
686-
self.assertEqual(idx_name_a.intersection(idx2_name_a).name, 'a')
687-
688-
#index intersection array
689-
self.assertEqual(idx_name_a.intersection(python_array).name, 'a')
690-
self.assertEqual(idx_name_a.intersection(numpy_array).name, 'a')
691-
692-
#index intersection index different dtype
693-
self.assertEqual(idx_name_a.intersection(stridx_name_a).name, 'a')
694-
self.assertEqual(idx_name_a.intersection(stridx_name_stra).name, None)
695-
696-
#index intersection index with no name
697-
self.assertEqual(idx_name_a.intersection(idx_name_none).name, 'a')
698-
699-
#index intersection dateindex
700-
self.assertEqual(idx_name_a.intersection(dateindex_name_a).name, 'a')
701-
self.assertEqual(idx_name_a.intersection(dateindex_name_b).name, None)
702-
self.assertEqual(idx_name_a.intersection(dateindex_name_None).name, 'a')
703-
704-
#dateindex intersection
705-
self.assertEqual(dateindex_name_a.intersection(python_array).name, 'a')
706-
self.assertEqual(dateindex_name_a.intersection(numpy_array).name, 'a')
707-
708-
self.assertEqual(dateindex_name_a.intersection(idx_name_none).name, 'a')
709-
self.assertEqual(dateindex_name_a.intersection(dateindex_name_b).name, None)
710-
self.assertEqual(dateindex_name_a.intersection(dateindex_name_None).name, 'a')
711-
self.assertEqual(dateindex_name_a.intersection(idx_name_a).name, 'a')
628+
self.compare_naming([1,2,3],[4,5,6],[2,5,6], func_name='intersection')
629+
self.compare_naming(['1','2','3'],['4','5','6'],['2','5','6'], func_name='intersection')
630+
self.compare_naming([1,'2',3],[4,'5','6'],[2,3,6], func_name='intersection')
631+
self.compare_naming([1.,2.,3.],[4.,5.,6.],[2.,3.,6.], func_name='intersection')
712632

713633
def test_append_naming_behavior(self):
714634
#9965
715-
idx_name_a = pd.Index([1,2,3], name='a')
716-
idx_name_b = pd.Index([4,5,6], name='b')
717-
idx2_name_a = pd.Index([2,9,8], name='a')
718-
719-
stridx_name_stra = pd.Index(['1','2'], name='stra')
720-
stridx_name_a = pd.Index(['1','2'], name='a')
721-
722-
idx_name_none = pd.Index(['1','2'], name=None)
723-
724-
dateindex_name_a = pd.DatetimeIndex([datetime.today()], name='a')
725-
dateindex_name_b = pd.DatetimeIndex([datetime.today()], name='b')
726-
dateindex_name_None = pd.DatetimeIndex([datetime.today()], name=None)
727-
728-
python_array = [1,2,3]
729-
python_array_transposed = [[1],[2],[3]]
730-
numpy_array = np.array([1,2,3])
731-
732-
#index append index naming behavior
733-
self.assertEqual(idx_name_a.append(idx_name_b).name, None)
734-
self.assertEqual(idx_name_a.append(idx2_name_a).name, 'a')
735-
736-
#index append array
737-
self.assertEqual(idx_name_a.append(python_array_transposed).name, 'a')
738-
self.assertEqual(idx_name_a.append(numpy_array.T).name, 'a')
739-
740-
#index append index different dtype
741-
self.assertEqual(idx_name_a.append(stridx_name_a).name, 'a')
742-
self.assertEqual(idx_name_a.append(stridx_name_stra).name, None)
743-
744-
#index append index with no name
745-
self.assertEqual(idx_name_a.append(idx_name_none).name, 'a')
746-
747-
#index append dateindex
748-
self.assertEqual(idx_name_a.append(dateindex_name_a).name, 'a')
749-
self.assertEqual(idx_name_a.append(dateindex_name_b).name, None)
750-
self.assertEqual(idx_name_a.append(dateindex_name_None).name, 'a')
751-
752-
#dateindex append
753-
self.assertEqual(dateindex_name_a.append(python_array_transposed).name, 'a')
754-
self.assertEqual(dateindex_name_a.append(numpy_array.T).name, 'a')
755-
756-
self.assertEqual(dateindex_name_a.append(idx_name_none).name, 'a')
757-
self.assertEqual(dateindex_name_a.append(dateindex_name_b).name, None)
758-
self.assertEqual(dateindex_name_a.append(dateindex_name_None).name, 'a')
759-
self.assertEqual(dateindex_name_a.append(idx_name_a).name, 'a')
635+
self.compare_naming([1,2,3],[4,5,6],[2,5,6], func_name='append')
636+
self.compare_naming(['1','2','3'],['4','5','6'],['2','5','6'], func_name='append')
637+
self.compare_naming([1,'2',3],[4,'5','6'],[2,3,6], func_name='append')
638+
self.compare_naming([1.,2.,3.],[4.,5.,6.],[2.,3.,6.], func_name='append')
639+
640+
def compare_naming(self, equal_values, disjunct_values, intersect_values, func_name='union'):
641+
'''
642+
given arrays of values checks whether the function specified
643+
keeps the naming convention
644+
645+
euqual_values : values to be used for equal comparison of func_name
646+
disjunct_values : values to be used for disjunct comparison of func_name
647+
intersect_values : values to be used for intersect comparison of func_name
648+
649+
func_name : either union, append, intersection
650+
'''
651+
idx_name_a = self.create_index(content=equal_values, name='a')
652+
idx_name_a_function = getattr(idx_name_a, func_name)
653+
654+
equal_idx_name_a = self.create_index(content=equal_values, name='a')
655+
equal_idx_name_b = self.create_index(content=equal_values, name='b')
656+
equal_idx_name_none = self.create_index(content=equal_values, name=None)
657+
equal_python_array = equal_values
658+
equal_numpy_array = np.array(equal_values)
659+
660+
empty_idx_name_a = self.create_index(content=[], name='a')
661+
empty_idx_name_b = self.create_index(content=[], name='b')
662+
empty_idx_name_none = self.create_index(content=[], name=None)
663+
empty_python_array = []
664+
empty_numpy_array = np.array([])
665+
666+
disjunct_idx_name_a = self.create_index(content=disjunct_values, name='a')
667+
disjunct_idx_name_b = self.create_index(content=disjunct_values, name='b')
668+
disjunct_idx_name_none = self.create_index(content=disjunct_values, name=None)
669+
disjunct_python_array = disjunct_values
670+
disjunct_numpy_array = np.array(disjunct_values)
671+
672+
intersect_idx_name_a = self.create_index(content=intersect_values, name='a')
673+
intersect_idx_name_b = self.create_index(content=intersect_values, name='b')
674+
intersect_idx_name_none = self.create_index(content=intersect_values, name=None)
675+
intersect_python_array = intersect_values
676+
intersect_numpy_array = np.array(intersect_values)
677+
678+
#index union naming behavior in equal contents
679+
self.assertEqual(idx_name_a_function(equal_idx_name_a).name, idx_name_a.name)
680+
self.assertEqual(idx_name_a_function(equal_idx_name_b).name, None)
681+
self.assertEqual(idx_name_a_function(equal_idx_name_none).name, idx_name_a.name)
682+
#self.assertEqual(idx_name_a_function(equal_python_array).name, idx_name_a.name)
683+
self.assertEqual(idx_name_a_function(equal_numpy_array).name, idx_name_a.name)
684+
685+
#index union naming behavior in empty second index
686+
self.assertEqual(idx_name_a_function(empty_idx_name_a).name, idx_name_a.name)
687+
self.assertEqual(idx_name_a_function(empty_idx_name_b).name, None)
688+
self.assertEqual(idx_name_a_function(empty_idx_name_none).name, idx_name_a.name)
689+
#self.assertEqual(idx_name_a_function(empty_python_array).name, idx_name_a.name)
690+
self.assertEqual(idx_name_a_function(empty_numpy_array).name, idx_name_a.name)
691+
692+
#index union naming behavior with disjunct contents
693+
self.assertEqual(idx_name_a_function(disjunct_idx_name_a).name, idx_name_a.name)
694+
self.assertEqual(idx_name_a_function(disjunct_idx_name_b).name, None)
695+
self.assertEqual(idx_name_a_function(disjunct_idx_name_none).name, idx_name_a.name)
696+
#self.assertEqual(idx_name_a_function(disjunct_python_array).name, idx_name_a.name)
697+
self.assertEqual(idx_name_a_function(disjunct_numpy_array).name, idx_name_a.name)
698+
699+
#index union naming behavior with intersecting content
700+
self.assertEqual(idx_name_a_function(intersect_idx_name_a).name, idx_name_a.name)
701+
self.assertEqual(idx_name_a_function(intersect_idx_name_b).name, None)
702+
self.assertEqual(idx_name_a_function(intersect_idx_name_none).name, idx_name_a.name)
703+
#self.assertEqual(idx_name_a_function(intersect_python_array).name, idx_name_a.name)
704+
self.assertEqual(idx_name_a_function(intersect_numpy_array).name, idx_name_a.name)
760705

761706
def test_intersection_preserves_name(self):
762707
#GH 9943
763-
df = pd.DataFrame([np.nan, np.nan], columns = ['tags'], index=pd.Int64Index([4815961, 4815962], dtype='int64', name='id'))
764-
self.assertEqual(str(df), ' tags\nid \n4815961 NaN\n4815962 NaN')
708+
df = pd.DataFrame([np.nan, np.nan],
709+
columns = ['tags'],
710+
index=pd.Int64Index([4815961, 4815962],
711+
dtype='int64', name='id'))
712+
self.assertEqual(str(df),
713+
' tags\nid \n4815961 NaN\n4815962 NaN')
765714
L = [4815962]
766715
self.assertEqual(list(L), list(df.index.intersection(L)))
767-
self.assertEqual( df.ix[L].tags.index.name, df.ix[df.index.intersection(L)].tags.index.name)
768-
assert_frame_equal(df.ix[L], df.ix[df.index.intersection(L)])
716+
self.assertEqual( df.ix[L].tags.index.name,
717+
df.ix[df.index.intersection(L)].tags.index.name)
718+
self.assertEqual( df.ix[L].index.name,
719+
df.ix[df.index.intersection(L)].index.name)
769720

770721
def test_intersection(self):
771722
first = self.strIndex[:20]

0 commit comments

Comments
 (0)