@@ -54,42 +54,45 @@ def test_loc_getitem_label(self):
54
54
# label
55
55
self .check_result ("loc" , "c" , typs = ["empty" ], fails = KeyError )
56
56
57
- def test_loc_getitem_label_out_of_range (self ):
57
+ @pytest .mark .parametrize (
58
+ "key, typs, axes" ,
59
+ [
60
+ ["f" , ["ints" , "uints" , "labels" , "mixed" , "ts" ], None ],
61
+ ["f" , ["floats" ], None ],
62
+ [20 , ["ints" , "uints" , "mixed" ], None ],
63
+ [20 , ["labels" ], None ],
64
+ [20 , ["ts" ], 0 ],
65
+ [20 , ["floats" ], 0 ],
66
+ ],
67
+ )
68
+ def test_loc_getitem_label_out_of_range (self , key , typs , axes ):
58
69
59
70
# out of range label
60
- self .check_result (
61
- "loc" , "f" , typs = ["ints" , "uints" , "labels" , "mixed" , "ts" ], fails = KeyError
62
- )
63
- self .check_result ("loc" , "f" , typs = ["floats" ], fails = KeyError )
64
- self .check_result ("loc" , "f" , typs = ["floats" ], fails = KeyError )
65
- self .check_result ("loc" , 20 , typs = ["ints" , "uints" , "mixed" ], fails = KeyError )
66
- self .check_result ("loc" , 20 , typs = ["labels" ], fails = KeyError )
67
- self .check_result ("loc" , 20 , typs = ["ts" ], axes = 0 , fails = KeyError )
68
- self .check_result ("loc" , 20 , typs = ["floats" ], axes = 0 , fails = KeyError )
71
+ self .check_result ("loc" , key , typs = typs , axes = axes , fails = KeyError )
69
72
70
- def test_loc_getitem_label_list (self ):
73
+ @pytest .mark .parametrize (
74
+ "key, typs" ,
75
+ [
76
+ [[0 , 1 , 2 ], ["ints" , "uints" , "floats" ]],
77
+ [[1 , 3.0 , "A" ], ["ints" , "uints" , "floats" ]],
78
+ ],
79
+ )
80
+ def test_loc_getitem_label_list (self , key , typs ):
71
81
# list of labels
72
- self .check_result (
73
- "loc" , [0 , 1 , 2 ], typs = ["ints" , "uints" , "floats" ], fails = KeyError
74
- )
75
- self .check_result (
76
- "loc" , [1 , 3.0 , "A" ], typs = ["ints" , "uints" , "floats" ], fails = KeyError
77
- )
78
-
79
- def test_loc_getitem_label_list_with_missing (self ):
80
- self .check_result ("loc" , [0 , 1 , 2 ], typs = ["empty" ], fails = KeyError )
81
- self .check_result (
82
- "loc" , [0 , 2 , 10 ], typs = ["ints" , "uints" , "floats" ], axes = 0 , fails = KeyError
83
- )
82
+ self .check_result ("loc" , key , typs = typs , fails = KeyError )
84
83
85
- self .check_result (
86
- "loc" , [3 , 6 , 7 ], typs = ["ints" , "uints" , "floats" ], axes = 1 , fails = KeyError
87
- )
88
-
89
- # GH 17758 - MultiIndex and missing keys
90
- self .check_result (
91
- "loc" , [(1 , 3 ), (1 , 4 ), (2 , 5 )], typs = ["multi" ], axes = 0 , fails = KeyError
92
- )
84
+ @pytest .mark .parametrize (
85
+ "key, typs, axes" ,
86
+ [
87
+ [[0 , 1 , 2 ], ["empty" ], None ],
88
+ [[0 , 2 , 10 ], ["ints" , "uints" , "floats" ], 0 ],
89
+ [[3 , 6 , 7 ], ["ints" , "uints" , "floats" ], 1 ],
90
+ # GH 17758 - MultiIndex and missing keys
91
+ [[(1 , 3 ), (1 , 4 ), (2 , 5 )], ["multi" ], 0 ],
92
+ ],
93
+ )
94
+ def test_loc_getitem_label_list_with_missing (self , key , typs , axes ):
95
+ self .check_result ("loc" , key , typs = typs , axes = axes , fails = KeyError )
93
96
94
97
def test_loc_getitem_label_list_fails (self ):
95
98
# fails
@@ -108,7 +111,22 @@ def test_loc_getitem_bool(self):
108
111
109
112
self .check_result ("loc" , b , typs = ["empty" ], fails = IndexError )
110
113
111
- def test_loc_getitem_label_slice (self ):
114
+ @pytest .mark .parametrize (
115
+ "slc, typs, axes, fails" ,
116
+ [
117
+ [
118
+ slice (1 , 3 ),
119
+ ["labels" , "mixed" , "empty" , "ts" , "floats" ],
120
+ None ,
121
+ TypeError ,
122
+ ],
123
+ [slice ("20130102" , "20130104" ), ["ts" ], 1 , TypeError ],
124
+ [slice (2 , 8 ), ["mixed" ], 0 , TypeError ],
125
+ [slice (2 , 8 ), ["mixed" ], 1 , KeyError ],
126
+ [slice (2 , 4 , 2 ), ["mixed" ], 0 , TypeError ],
127
+ ],
128
+ )
129
+ def test_loc_getitem_label_slice (self , slc , typs , axes , fails ):
112
130
113
131
# label slices (with ints)
114
132
@@ -118,20 +136,10 @@ def test_loc_getitem_label_slice(self):
118
136
119
137
self .check_result (
120
138
"loc" ,
121
- slice (1 , 3 ),
122
- typs = ["labels" , "mixed" , "empty" , "ts" , "floats" ],
123
- fails = TypeError ,
124
- )
125
-
126
- self .check_result (
127
- "loc" , slice ("20130102" , "20130104" ), typs = ["ts" ], axes = 1 , fails = TypeError
128
- )
129
-
130
- self .check_result ("loc" , slice (2 , 8 ), typs = ["mixed" ], axes = 0 , fails = TypeError )
131
- self .check_result ("loc" , slice (2 , 8 ), typs = ["mixed" ], axes = 1 , fails = KeyError )
132
-
133
- self .check_result (
134
- "loc" , slice (2 , 4 , 2 ), typs = ["mixed" ], axes = 0 , fails = TypeError
139
+ slc ,
140
+ typs = typs ,
141
+ axes = axes ,
142
+ fails = fails ,
135
143
)
136
144
137
145
def test_setitem_from_duplicate_axis (self ):
@@ -956,55 +964,40 @@ def test_loc_non_unique(self):
956
964
tm .assert_frame_equal (result , expected )
957
965
958
966
@pytest .mark .arm_slow
959
- def test_loc_non_unique_memory_error (self ):
967
+ @pytest .mark .parametrize ("length, l2" , [[900 , 100 ], [900000 , 100000 ]])
968
+ def test_loc_non_unique_memory_error (self , length , l2 ):
960
969
961
970
# GH 4280
962
971
# non_unique index with a large selection triggers a memory error
963
972
964
973
columns = list ("ABCDEFG" )
965
974
966
- def gen_test (length , l2 ):
967
- return pd .concat (
968
- [
969
- DataFrame (
970
- np .random .randn (length , len (columns )),
971
- index = np .arange (length ),
972
- columns = columns ,
973
- ),
974
- DataFrame (
975
- np .ones ((l2 , len (columns ))), index = [0 ] * l2 , columns = columns
976
- ),
977
- ]
978
- )
979
-
980
- def gen_expected (df , mask ):
981
- len_mask = len (mask )
982
- return pd .concat (
983
- [
984
- df .take ([0 ]),
985
- DataFrame (
986
- np .ones ((len_mask , len (columns ))),
987
- index = [0 ] * len_mask ,
988
- columns = columns ,
989
- ),
990
- df .take (mask [1 :]),
991
- ]
992
- )
993
-
994
- df = gen_test (900 , 100 )
995
- assert df .index .is_unique is False
996
-
997
- mask = np .arange (100 )
998
- result = df .loc [mask ]
999
- expected = gen_expected (df , mask )
1000
- tm .assert_frame_equal (result , expected )
975
+ df = pd .concat (
976
+ [
977
+ DataFrame (
978
+ np .random .randn (length , len (columns )),
979
+ index = np .arange (length ),
980
+ columns = columns ,
981
+ ),
982
+ DataFrame (np .ones ((l2 , len (columns ))), index = [0 ] * l2 , columns = columns ),
983
+ ]
984
+ )
1001
985
1002
- df = gen_test (900000 , 100000 )
1003
986
assert df .index .is_unique is False
1004
987
1005
- mask = np .arange (100000 )
988
+ mask = np .arange (l2 )
1006
989
result = df .loc [mask ]
1007
- expected = gen_expected (df , mask )
990
+ expected = pd .concat (
991
+ [
992
+ df .take ([0 ]),
993
+ DataFrame (
994
+ np .ones ((len (mask ), len (columns ))),
995
+ index = [0 ] * len (mask ),
996
+ columns = columns ,
997
+ ),
998
+ df .take (mask [1 :]),
999
+ ]
1000
+ )
1008
1001
tm .assert_frame_equal (result , expected )
1009
1002
1010
1003
def test_loc_name (self ):
@@ -1840,12 +1833,20 @@ def test_loc_setitem_empty_series(self):
1840
1833
ser .loc [3 ] = 3
1841
1834
tm .assert_series_equal (ser , Series ([1 , 3 ], index = [1 , 3 ]))
1842
1835
1836
+ def test_loc_setitem_empty_series_float (self ):
1837
+ # GH#5226
1838
+
1839
+ # partially set with an empty object series
1843
1840
ser = Series (dtype = object )
1844
1841
ser .loc [1 ] = 1.0
1845
1842
tm .assert_series_equal (ser , Series ([1.0 ], index = [1 ]))
1846
1843
ser .loc [3 ] = 3.0
1847
1844
tm .assert_series_equal (ser , Series ([1.0 , 3.0 ], index = [1 , 3 ]))
1848
1845
1846
+ def test_loc_setitem_empty_series_str_idx (self ):
1847
+ # GH#5226
1848
+
1849
+ # partially set with an empty object series
1849
1850
ser = Series (dtype = object )
1850
1851
ser .loc ["foo" ] = 1
1851
1852
tm .assert_series_equal (ser , Series ([1 ], index = ["foo" ]))
@@ -1864,24 +1865,26 @@ def test_loc_setitem_incremental_with_dst(self):
1864
1865
expected = Series (1 , index = idxs )
1865
1866
tm .assert_series_equal (result , expected )
1866
1867
1867
- def test_loc_setitem_datetime_keys_cast (self ):
1868
- # GH#9516
1869
- dt1 = Timestamp ("20130101 09:00:00" )
1870
- dt2 = Timestamp ("20130101 10:00:00" )
1871
-
1872
- for conv in [
1868
+ @pytest .mark .parametrize (
1869
+ "conv" ,
1870
+ [
1873
1871
lambda x : x ,
1874
1872
lambda x : x .to_datetime64 (),
1875
1873
lambda x : x .to_pydatetime (),
1876
1874
lambda x : np .datetime64 (x ),
1877
- ]:
1878
-
1879
- df = DataFrame ()
1880
- df .loc [conv (dt1 ), "one" ] = 100
1881
- df .loc [conv (dt2 ), "one" ] = 200
1875
+ ],
1876
+ ids = ["self" , "to_datetime64" , "to_pydatetime" , "np.datetime64" ],
1877
+ )
1878
+ def test_loc_setitem_datetime_keys_cast (self , conv ):
1879
+ # GH#9516
1880
+ dt1 = Timestamp ("20130101 09:00:00" )
1881
+ dt2 = Timestamp ("20130101 10:00:00" )
1882
+ df = DataFrame ()
1883
+ df .loc [conv (dt1 ), "one" ] = 100
1884
+ df .loc [conv (dt2 ), "one" ] = 200
1882
1885
1883
- expected = DataFrame ({"one" : [100.0 , 200.0 ]}, index = [dt1 , dt2 ])
1884
- tm .assert_frame_equal (df , expected )
1886
+ expected = DataFrame ({"one" : [100.0 , 200.0 ]}, index = [dt1 , dt2 ])
1887
+ tm .assert_frame_equal (df , expected )
1885
1888
1886
1889
def test_loc_setitem_categorical_column_retains_dtype (self , ordered ):
1887
1890
# GH16360
0 commit comments