Skip to content

Commit

Permalink
Merge remote branch 'y-p/fix1'
Browse files Browse the repository at this point in the history
* y-p/fix1:
  ENH: warn user when invoking to_dict() on df with non-unique columns
  BUG: modify df.iteritems to support duplicate column labels #2219
  TST: df.iteritems() should yield Series even with non-unique column labels
  BUG: df with dupe cols should raise KeyError on accessing non-existent col via list #2218
  TST: df with dupe cols should raise KeyError on accessing non-existent col via list
  • Loading branch information
wesm committed Nov 13, 2012
2 parents ca8a6ba + bd45d39 commit b4f4e25
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
14 changes: 12 additions & 2 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,8 @@ def keys(self):

def iteritems(self):
"""Iterator over (column, series) pairs"""
return ((k, self[k]) for k in self.columns)
for i, k in enumerate(self.columns):
yield (k,self.take([i],axis=1)[k])

def iterrows(self):
"""
Expand Down Expand Up @@ -836,6 +837,10 @@ def to_dict(self, outtype='dict'):
-------
result : dict like {column -> {index -> value}}
"""
import warnings
if not self.columns.is_unique:
warnings.warn("DataFrame columns are not unique, some "
"columns will be omitted.",UserWarning)
if outtype.lower().startswith('d'):
return dict((k, v.to_dict()) for k, v in self.iteritems())
elif outtype.lower().startswith('l'):
Expand Down Expand Up @@ -1795,13 +1800,18 @@ def _getitem_array(self, key):
indexer = self.columns.get_indexer(key)
mask = indexer == -1
if mask.any():
raise KeyError("No column(s) named: %s" % str(key[mask]))
raise KeyError("No column(s) named: %s" %
com.pprint_thing(key[mask]))
result = self.reindex(columns=key)
if result.columns.name is None:
result.columns.name = self.columns.name
return result
else:
mask = self.columns.isin(key)
for k in key:
if k not in self.columns:
raise KeyError("No column(s) named: %s" %
com.pprint_thing(k))
return self.take(mask.nonzero()[0], axis=1)

def _slice(self, slobj, axis=0):
Expand Down
15 changes: 15 additions & 0 deletions pandas/tests/test_frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,15 @@ def test_getitem(self):
self.assert_('random' not in self.frame)
self.assertRaises(Exception, self.frame.__getitem__, 'random')

def test_getitem_dupe_cols(self):
df=DataFrame([[1,2,3],[4,5,6]],columns=['a','a','b'])
try:
df[['baf']]
except KeyError:
pass
else:
self.fail("Dataframe failed to raise KeyError")

def test_get(self):
b = self.frame.get('B')
assert_series_equal(b, self.frame['B'])
Expand Down Expand Up @@ -1147,6 +1156,11 @@ def test_get_value(self):
expected = self.frame[col][idx]
assert_almost_equal(result, expected)

def test_iteritems(self):
df=DataFrame([[1,2,3],[4,5,6]],columns=['a','a','b'])
for k,v in df.iteritems():
self.assertEqual(type(v),Series)

def test_lookup(self):
def alt(df, rows, cols):
result = []
Expand Down Expand Up @@ -7523,6 +7537,7 @@ def __nonzero__(self):
self.assert_(r0.all())
self.assert_(r1.all())


if __name__ == '__main__':
# unittest.main()
import nose
Expand Down

0 comments on commit b4f4e25

Please sign in to comment.