pandasで単独の要素に値を代入する際のiatとilocの違いについて ValueError: could not convert string to float:


単独の要素に値を代入する際のiatとilocの違いについて

[code]

    df1 = pd.DataFrame([[np.nan, 2], [1, 3], [4, 6]], columns=['A', 'B'])
    df2 = pd.DataFrame([['aaa', 'bbb'], [1, 3], [4, 6]], columns=['A', 'B'])
    
[/code]

[code]

       A    B
    0   NaN 2
    1   1.0 3
    2   4.0 6
    
[/code]

[code]

       A    B
    0   aaa bbb
    1   1   3
    2   4   6
    
[/code]

例えばこのようなデータフレームで下記のようにiatで値を代入しようとすると

[code]

    df1.iat[0,0] = df2.iat[0,0]
    
[/code]

とすると

> ValueError: could not convert string to float: 'aaa'

のエラーになりますがilocで

[code]

    df1.iloc[0,0] = df2.iloc[0,0]
    
[/code]

だと問題なく代入できるのはなぜでしょうか？




(コメントより)

ソースコードを眺めてみると、`iat()` では type casting
ができない場合、エラー(ValueError)を送出してお終いになります(exception handling なし)。例えば
`np.float64('aaa')` を実行してみると同じエラーが発生します。一方、`iloc()` では ValueError
を捕捉して(exception handling あり)、値を入れ替えてしまいます。この場合は `NaN(numpy.float64 type)` が
`aaa(str type)` に入れ替わる事になります。




(コメントより)

ソースコードを眺めてみると、`iat()` では type casting
ができない場合、エラー(ValueError)を送出してお終いになります(exception handling なし)。例えば
`np.float64('aaa')` を実行してみると同じエラーが発生します。一方、`iloc()` では ValueError
を捕捉して(exception handling あり)、値を入れ替えてしまいます。この場合は `NaN(numpy.float64 type)` が
`aaa(str type)` に入れ替わる事になります。

