|
18 | 18 | from pandas.tests.frame.common import TestData
|
19 | 19 | import pandas.util.testing as tm
|
20 | 20 | from pandas.util.testing import (
|
21 |
| - assert_almost_equal, assert_frame_equal, assert_series_equal) |
| 21 | + assert_almost_equal, assert_frame_equal, assert_index_equal, |
| 22 | + assert_numpy_array_equal, assert_series_equal) |
22 | 23 |
|
23 | 24 | from pandas.tseries.offsets import BDay
|
24 | 25 |
|
@@ -185,6 +186,51 @@ def test_setitem_list_of_tuples(self):
|
185 | 186 | expected = Series(tuples, index=self.frame.index, name='tuples')
|
186 | 187 | assert_series_equal(result, expected)
|
187 | 188 |
|
| 189 | + def test_setitem_list_all_missing_columns_scalar(self): |
| 190 | + df = self.frame.copy() |
| 191 | + df[['E', 'F']] = 1 |
| 192 | + |
| 193 | + result = df.columns |
| 194 | + expected = self.frame.columns.union(['E', 'F']) |
| 195 | + assert_index_equal(result, expected) |
| 196 | + |
| 197 | + result = df[self.frame.columns] |
| 198 | + expected = self.frame |
| 199 | + assert_frame_equal(result, expected) |
| 200 | + |
| 201 | + assert (df[['E', 'F']] == 1).all().all() |
| 202 | + |
| 203 | + def test_setitem_list_some_missing_columns_list(self): |
| 204 | + df = self.frame.copy() |
| 205 | + df[['A', 'E']] = [1, 2] |
| 206 | + |
| 207 | + result = df.columns |
| 208 | + expected = self.frame.columns.union(['E']) |
| 209 | + assert_index_equal(result, expected) |
| 210 | + |
| 211 | + result = df[self.frame.columns.drop('A')] |
| 212 | + expected = self.frame.drop('A', axis=1) |
| 213 | + assert_frame_equal(result, expected) |
| 214 | + |
| 215 | + assert (df['A'] == 1).all() |
| 216 | + assert (df['E'] == 2).all() |
| 217 | + |
| 218 | + def test_setitem_list_some_missing_columns_dataframe(self): |
| 219 | + df = self.frame.copy() |
| 220 | + df[['A', 'E']] = self.frame[['B', 'C']] |
| 221 | + |
| 222 | + result = df.columns |
| 223 | + expected = self.frame.columns.union(['E']) |
| 224 | + assert_index_equal(result, expected) |
| 225 | + |
| 226 | + result = df[self.frame.columns.drop('A')] |
| 227 | + expected = self.frame.drop('A', axis=1) |
| 228 | + assert_frame_equal(result, expected) |
| 229 | + |
| 230 | + result = df[['A', 'E']] |
| 231 | + expected = self.frame[['B', 'C']] |
| 232 | + assert_numpy_array_equal(result.to_numpy(), expected.to_numpy()) |
| 233 | + |
188 | 234 | def test_setitem_mulit_index(self):
|
189 | 235 | # GH7655, test that assigning to a sub-frame of a frame
|
190 | 236 | # with multi-index columns aligns both rows and columns
|
@@ -454,9 +500,6 @@ def test_setitem(self):
|
454 | 500 | self.frame['col6'] = series
|
455 | 501 | tm.assert_series_equal(series, self.frame['col6'], check_names=False)
|
456 | 502 |
|
457 |
| - with pytest.raises(KeyError): |
458 |
| - self.frame[np.random.randn(len(self.frame) + 1)] = 1 |
459 |
| - |
460 | 503 | # set ndarray
|
461 | 504 | arr = np.random.randn(len(self.frame))
|
462 | 505 | self.frame['col9'] = arr
|
@@ -1093,10 +1136,11 @@ def test_fancy_index_int_labels_exceptions(self):
|
1093 | 1136 | r" dtype='object'\)\] are in the \[index\]")
|
1094 | 1137 | with pytest.raises(KeyError, match=msg):
|
1095 | 1138 | self.frame.ix[['foo', 'bar', 'baz']] = 1
|
1096 |
| - msg = (r"None of \[Index\(\['E'\], dtype='object'\)\] are in the" |
1097 |
| - r" \[columns\]") |
1098 |
| - with pytest.raises(KeyError, match=msg): |
1099 |
| - self.frame.ix[:, ['E']] = 1 |
| 1139 | + # partial setting now allows this GH13658 |
| 1140 | + # msg = (r"None of \[Index\(\['E'\], dtype='object'\)\] are in the" |
| 1141 | + # r" \[columns\]") |
| 1142 | + # with pytest.raises(KeyError, match=msg): |
| 1143 | + # self.frame.ix[:, ['E']] = 1 |
1100 | 1144 |
|
1101 | 1145 | # partial setting now allows this GH2578
|
1102 | 1146 | # pytest.raises(KeyError, self.frame.ix.__setitem__,
|
|
0 commit comments