Skip to content

Commit 54621c7

Browse files
committed
Merge pull request #8475 from jreback/at_fix
BUG: .at indexing should allow enlargement scalars w/o regards to the type of index (GH8473)
2 parents c741a54 + 8c51d86 commit 54621c7

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

pandas/core/indexing.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -1484,7 +1484,7 @@ class _ScalarAccessIndexer(_NDFrameIndexer):
14841484

14851485
""" access scalars quickly """
14861486

1487-
def _convert_key(self, key):
1487+
def _convert_key(self, key, is_setter=False):
14881488
return list(key)
14891489

14901490
def __getitem__(self, key):
@@ -1505,7 +1505,7 @@ def __setitem__(self, key, value):
15051505
if len(key) != self.obj.ndim:
15061506
raise ValueError('Not enough indexers for scalar access '
15071507
'(setting)!')
1508-
key = list(self._convert_key(key))
1508+
key = list(self._convert_key(key, is_setter=True))
15091509
key.append(value)
15101510
self.obj.set_value(*key, takeable=self._takeable)
15111511

@@ -1515,8 +1515,13 @@ class _AtIndexer(_ScalarAccessIndexer):
15151515
""" label based scalar accessor """
15161516
_takeable = False
15171517

1518-
def _convert_key(self, key):
1518+
def _convert_key(self, key, is_setter=False):
15191519
""" require they keys to be the same type as the index (so we don't fallback) """
1520+
1521+
# allow arbitrary setting
1522+
if is_setter:
1523+
return list(key)
1524+
15201525
for ax, i in zip(self.obj.axes, key):
15211526
if ax.is_integer():
15221527
if not com.is_integer(i):
@@ -1536,7 +1541,7 @@ class _iAtIndexer(_ScalarAccessIndexer):
15361541
def _has_valid_setitem_indexer(self, indexer):
15371542
self._has_valid_positional_setitem_indexer(indexer)
15381543

1539-
def _convert_key(self, key):
1544+
def _convert_key(self, key, is_setter=False):
15401545
""" require integer args (and convert to label arguments) """
15411546
for a, i in zip(self.obj.axes, key):
15421547
if not com.is_integer(i):

pandas/tests/test_indexing.py

+20
Original file line numberDiff line numberDiff line change
@@ -2932,6 +2932,26 @@ def f():
29322932
p.loc[:,:,'C'] = Series([30,32],index=p_orig.items)
29332933
assert_panel_equal(p,expected)
29342934

2935+
# GH 8473
2936+
dates = date_range('1/1/2000', periods=8)
2937+
df_orig = DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
2938+
2939+
expected = pd.concat([df_orig,DataFrame({'A' : 7},index=[dates[-1]+1])])
2940+
df = df_orig.copy()
2941+
df.loc[dates[-1]+1, 'A'] = 7
2942+
assert_frame_equal(df,expected)
2943+
df = df_orig.copy()
2944+
df.at[dates[-1]+1, 'A'] = 7
2945+
assert_frame_equal(df,expected)
2946+
2947+
expected = pd.concat([df_orig,DataFrame({0 : 7},index=[dates[-1]+1])],axis=1)
2948+
df = df_orig.copy()
2949+
df.loc[dates[-1]+1, 0] = 7
2950+
assert_frame_equal(df,expected)
2951+
df = df_orig.copy()
2952+
df.at[dates[-1]+1, 0] = 7
2953+
assert_frame_equal(df,expected)
2954+
29352955
def test_partial_setting_mixed_dtype(self):
29362956

29372957
# in a mixed dtype environment, try to preserve dtypes

0 commit comments

Comments
 (0)