Skip to content

Commit 76ac02e

Browse files
committed
BUG: fix Panel slice setting issue and matplotlib import issues #1548, #1533
1 parent acb5f03 commit 76ac02e

File tree

5 files changed

+38
-5
lines changed

5 files changed

+38
-5
lines changed

pandas/core/indexing.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@ def _convert_tuple(self, key):
7575
return tuple(keyidx)
7676

7777
def _setitem_with_indexer(self, indexer, value):
78+
from pandas.core.frame import DataFrame
79+
7880
# also has the side effect of consolidating in-place
81+
82+
# mmm, spaghetti
83+
7984
if self.obj._is_mixed_type:
8085
if not isinstance(indexer, tuple):
8186
indexer = self._tuplify(indexer)
@@ -89,6 +94,10 @@ def _setitem_with_indexer(self, indexer, value):
8994
plane_indexer = indexer[:het_axis] + indexer[het_axis + 1:]
9095
item_labels = self.obj._get_axis(het_axis)
9196

97+
if isinstance(value, (np.ndarray, DataFrame)) and value.ndim > 1:
98+
raise ValueError('Setting mixed-type DataFrames with '
99+
'array/DataFrame pieces not yet supported')
100+
92101
try:
93102
for item in item_labels[het_idx]:
94103
data = self.obj[item]
@@ -100,6 +109,12 @@ def _setitem_with_indexer(self, indexer, value):
100109
else:
101110
if isinstance(indexer, tuple):
102111
indexer = _maybe_convert_ix(*indexer)
112+
113+
if isinstance(value, DataFrame):
114+
value = value.values
115+
if not isinstance(self.obj, DataFrame):
116+
value = value.T
117+
103118
self.obj.values[indexer] = value
104119

105120
def _getitem_tuple(self, tup):

pandas/tests/test_frame.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,17 @@ def test_setitem_single_column_mixed(self):
932932
expected = [nan, 'qux', nan, 'qux', nan]
933933
assert_almost_equal(df['str'].values, expected)
934934

935+
def test_setitem_frame(self):
936+
piece = self.frame.ix[:2, ['A', 'B']]
937+
self.frame.ix[-2:, ['A', 'B']] = piece
938+
assert_almost_equal(self.frame.ix[-2:, ['A', 'B']].values,
939+
piece.values)
940+
941+
piece = self.mixed_frame.ix[:2, ['A', 'B']]
942+
f = self.mixed_frame.ix.__setitem__
943+
key = (slice(-2, None), ['A', 'B'])
944+
self.assertRaises(ValueError, f, key, piece)
945+
935946
def test_setitem_fancy_exceptions(self):
936947
pass
937948

pandas/tests/test_panel.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ def test_getitem_fancy_ints(self):
519519
def test_getitem_fancy_xs(self):
520520
p = self.panel
521521
item = 'ItemB'
522+
522523
date = p.major_axis[5]
523524
col = 'C'
524525

@@ -565,6 +566,16 @@ def test_getitem_fancy_xs_check_view(self):
565566
self._check_view((item, NS, 'C'), comp)
566567
self._check_view((NS, date, 'C'), comp)
567568

569+
def test_ix_setitem_slice_dataframe(self):
570+
a = Panel(items=[1,2,3],major_axis=[11,22,33],minor_axis=[111,222,333])
571+
b = DataFrame(np.random.randn(2,3), index=[111,333],
572+
columns=[1,2,3])
573+
574+
a.ix[:, 22, [111, 333]] = b
575+
576+
assert_frame_equal(a.ix[:, 22, [111, 333]], b)
577+
578+
568579
def _check_view(self, indexer, comp):
569580
cp = self.panel.copy()
570581
obj = cp.ix[indexer]

pandas/tools/plotting.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77

88
from pandas.util.decorators import cache_readonly
99
import pandas.core.common as com
10-
from pandas.core.index import Index, MultiIndex
10+
from pandas.core.index import MultiIndex
1111
from pandas.core.series import Series, remove_na
1212
from pandas.tseries.index import DatetimeIndex
1313
from pandas.tseries.period import PeriodIndex
1414
from pandas.tseries.frequencies import get_period_alias, get_base_alias
1515
from pandas.tseries.offsets import DateOffset
16-
import pandas.tseries.tools as datetools
17-
import pandas.lib as lib
1816

1917
try: # mpl optional
2018
import pandas.tseries.converter as conv

pandas/tseries/converter.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
import matplotlib.units as units
66
import matplotlib.dates as dates
7-
import matplotlib.cbook as cbook
8-
from matplotlib import pylab
97
from matplotlib.ticker import Formatter, AutoLocator, Locator
108
from matplotlib.transforms import nonsingular
119

0 commit comments

Comments
 (0)