@@ -2812,7 +2812,8 @@ def f():
2812
2812
df .loc [1 ] = df .loc [2 ]
2813
2813
assert_frame_equal (df ,expected )
2814
2814
2815
- expected = DataFrame (dict ({ 'A' : [0 ,2 ,4 ,4 ], 'B' : [1 ,3 ,5 ,5 ] }),dtype = 'float64' )
2815
+ # like 2578, partial setting with dtype preservation
2816
+ expected = DataFrame (dict ({ 'A' : [0 ,2 ,4 ,4 ], 'B' : [1 ,3 ,5 ,5 ] }))
2816
2817
df = df_orig .copy ()
2817
2818
df .loc [3 ] = df .loc [2 ]
2818
2819
assert_frame_equal (df ,expected )
@@ -2864,6 +2865,41 @@ def f():
2864
2865
p .loc [:,:,'C' ] = Series ([30 ,32 ],index = p_orig .items )
2865
2866
assert_panel_equal (p ,expected )
2866
2867
2868
+ def test_partial_setting_mixed_dtype (self ):
2869
+
2870
+ # in a mixed dtype environment, try to preserve dtypes
2871
+ # by appending
2872
+ df = DataFrame ([[True , 1 ],[False , 2 ]],
2873
+ columns = ["female" ,"fitness" ])
2874
+
2875
+ s = df .loc [1 ].copy ()
2876
+ s .name = 2
2877
+ expected = df .append (s )
2878
+
2879
+ df .loc [2 ] = df .loc [1 ]
2880
+ assert_frame_equal (df , expected )
2881
+
2882
+ # columns will align
2883
+ df = DataFrame (columns = ['A' ,'B' ])
2884
+ df .loc [0 ] = Series (1 ,index = range (4 ))
2885
+ assert_frame_equal (df ,DataFrame (columns = ['A' ,'B' ],index = [0 ]))
2886
+
2887
+ # columns will align
2888
+ df = DataFrame (columns = ['A' ,'B' ])
2889
+ df .loc [0 ] = Series (1 ,index = ['B' ])
2890
+ assert_frame_equal (df ,DataFrame ([[np .nan , 1 ]], columns = ['A' ,'B' ],index = [0 ],dtype = 'float64' ))
2891
+
2892
+ # list-like must conform
2893
+ df = DataFrame (columns = ['A' ,'B' ])
2894
+ def f ():
2895
+ df .loc [0 ] = [1 ,2 ,3 ]
2896
+ self .assertRaises (ValueError , f )
2897
+
2898
+ # these are coerced to float unavoidably (as its a list-like to begin)
2899
+ df = DataFrame (columns = ['A' ,'B' ])
2900
+ df .loc [3 ] = [6 ,7 ]
2901
+ assert_frame_equal (df ,DataFrame ([[6 ,7 ]],index = [3 ],columns = ['A' ,'B' ],dtype = 'float64' ))
2902
+
2867
2903
def test_series_partial_set (self ):
2868
2904
# partial set with new index
2869
2905
# Regression from GH4825
@@ -3013,15 +3049,6 @@ def f():
3013
3049
assert_frame_equal (df ,DataFrame ([[1 ]],index = ['foo' ],columns = [1 ]))
3014
3050
assert_frame_equal (df ,df2 )
3015
3051
3016
- df = DataFrame (columns = ['A' ,'B' ])
3017
- df .loc [3 ] = [6 ,7 ]
3018
- assert_frame_equal (df ,DataFrame ([[6 ,7 ]],index = [3 ],columns = ['A' ,'B' ]))
3019
-
3020
- # no label overlap
3021
- df = DataFrame (columns = ['A' ,'B' ])
3022
- df .loc [0 ] = Series (1 ,index = range (4 ))
3023
- assert_frame_equal (df ,DataFrame (columns = ['A' ,'B' ],index = [0 ]))
3024
-
3025
3052
# no index to start
3026
3053
expected = DataFrame ({ 0 : Series (1 ,index = range (4 )) },columns = ['A' ,'B' ,0 ])
3027
3054
0 commit comments