

下記のコードでコラムTOPIX dのデータをString型に変えようとしているのですが、  
`data.dtypes`でデータ型を確認すると、オリジナルと変わらずobject型のままで表示されます。

どうしてでしょうか・・・・・

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv("forcasting topx.csv", header=0)
    
    #冒頭数行を削除
    data = df.drop([0,1,2,3])
    
    #型の変更
    data['TOPIX d'].astype(np.str)
    data.dtypes
    
[/code]


CC BY-SA 3.0
2018-02-06T12:27:24.577
41519
2019-05-03T03:04:00.740
2018-02-06T12:43:53.673
19110
27306
question
python python3 pandas
CSVファイルデータのデータ型変換について: astype しても dtype が変わらない


[`pandas.DataFrame.astype`](https://pandas.pydata.org/pandas-
docs/stable/generated/pandas.DataFrame.astype.html) は、キャストした内容を戻り値にするだけであり、元の
dataframe の内容を変える関数ではありません。以下はこのことのサンプルコードです。

[code]

    >>> ser = pd.Series([1, 2], dtype='int32')
    >>> ser.astype('int64')
    0    1
    1    2
    dtype: int64
    >>> ser
    0    1
    1    2
    dtype: int32
    
[/code]

文字列型の値として扱いたければ、`astype`
した結果を代入するか、[`read_csv`](https://pandas.pydata.org/pandas-
docs/stable/generated/pandas.read_csv.html) のオプション引数 `dtype` を使ってはじめから dtype
を指定してあげれば良いです。


CC BY-SA 3.0
2018-02-06T12:39:11.053
41520
2018-02-06T12:39:11.053
19110
41519
answer


文字列に関しては、`numpy`と`pandas`で扱いが異なります。`numpy`は配列の中に文字列を固定長で持つ`np.str`型がありますが、`pandas`の方はDataFrameの中で文字列を持つことはなくオブジェクトへのポインターだけを持っているので`object`型となります。`pandas`で`np.str`型にしたいと思っても変換することはできません。

データをString型に変えようとするのか理由がわかりませんが、もともと文字列になる要素であれば、DataFrameの個々の要素は`str`型になっているので何も心配をする必要はありません。

また、要素の中に数値が含まれていて、それを文字列に変更したいのであれば、`astype(str)`で変換できます。`DataFrame`を`dtypes`で調べると`object`型のままですが、個々の要素の型を調べるときちんと`str`型になっています。

[code]

    data = pd.DataFrame([['a'], ['b'], [3]])
    >>> data = pd.DataFrame([['a'], ['b'], [3]])
    >>> type(data.iloc[2,0])
    <class 'int'>
    >>> data[0] = data[0].astype(str)
    >>> type(data.iloc[2,0])
    <class 'str'>    
    
[/code]


CC BY-SA 4.0
2018-08-26T14:56:45.097
47823
2018-08-27T00:56:38.487
2018-08-27T00:56:38.487
15171
15171
41519
answer