web-dev-qa-db-ja.com

pandas-df.indexをfloat64からUnicodeまたは文字列に変更します

データフレームのインデックス(行)をfloat64から文字列またはUnicodeに変更します。

私はこれがうまくいくと思ったが、明らかにそうではない:

#check type
type(df.index)
'pandas.core.index.Float64Index'

#change type to unicode
if not isinstance(df.index, unicode):
    df.index = df.index.astype(unicode)

エラーメッセージ:

TypeError: Setting <class 'pandas.core.index.Float64Index'> dtype to anything other than float64 or object is not supported
44
Boosted_d16

そのようにすることができます:

# for Python 2
df.index = df.index.map(unicode) 

# for Python 3 (the unicode type does not exist and is replaced by str)
df.index = df.index.map(str)

Intからfloatに変換するときとは異なる方法で進む理由については、それがnumpy(pandasのベースとなっているライブラリ)の特性です。

すべてのnumpy配列にはdtypeがあり、これは基本的に要素のmachineタイプです:その方法でnumpyはPythonオブジェクトではなく、ネイティブタイプを直接処理します。したがって、dtypeをint64からfloat64に変更する場合、numpyはCコードの各要素をキャストします。

特別なdtypeもあります:object、基本的にPythonオブジェクトへのポインタを提供します。

したがって、文字列が必要な場合は、objectdtypeを使用する必要があります。ただし、.astype(object)を使用しても、探している答えは得られません。代わりに、objectdtypeでインデックスを作成しますが、Python内部のオブジェクトをフロートします。

ここで、mapを使用して、適切な関数でインデックスを文字列に変換します。numpyは文字列オブジェクトを取得し、インデックスにobjectが必要であることを理解しますdtype。文字列を収容できる唯一のdtypeであるため。

69
Arthur

python 3およびpandas 0.19以降のバージョンでは、次のことがうまくいくことがわかりました

    # Python 3 (pandas 0.19 or latter versions)
    df.index.astype(str, copy = False)
3
Chia-Yu Chien