web-dev-qa-db-ja.com

DataFrameの文字列、ただしdtypeはオブジェクト

なぜPandasがオブジェクトを持っていることを教えてくれますが、選択された列のすべてのアイテムは、明示的な変換の後でも文字列です。

これは私のDataFrameです:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 56992 entries, 0 to 56991
Data columns (total 7 columns):
id            56992  non-null values
attr1         56992  non-null values
attr2         56992  non-null values
attr3         56992  non-null values
attr4         56992  non-null values
attr5         56992  non-null values
attr6         56992  non-null values
dtypes: int64(2), object(5)

それらの5つはdtype objectです。これらのオブジェクトを明示的に文字列に変換します。

for c in df.columns:
    if df[c].dtype == object:
        print "convert ", df[c].name, " to string"
        df[c] = df[c].astype(str)

その後、df["attr2"]dtype objectを保持しますが、type(df["attr2"].ix[0]strを明らかにしますが、これは正しいです。

パンダは、int64float64objectを区別します。 dtype strがない場合の背後にあるロジックは何ですか? strobjectで覆われているのはなぜですか?

82
Xiphias

DtypeオブジェクトはNumPyに由来し、ndarrayの要素のタイプを記述します。 ndarrayのすべての要素は、バイト単位で同じサイズでなければなりません。 int64およびfloat64の場合、8バイトです。ただし、文字列の場合、文字列の長さは固定されていません。したがって、ndarrayに文字列のバイトを直接保存する代わりに、Pandasを使用して、オブジェクトへのポインターを保存するオブジェクトndarrayを使用します。

以下に例を示します。

  • int64配列には4つのint64値が含まれます。
  • オブジェクト配列には、3つの文字列オブジェクトへの4つのポインターが含まれています。

enter image description here

131
HYRY

受け入れられた答えは良いです。 ドキュメントを参照 という答えを提供したかっただけです。ドキュメントには次のように書かれています:

Pandasは、文字列の格納にオブジェクトdtypeを使用します。

主要なコメントには「心配しないで、このようになっているはずです」と書かれています。 (受け入れられた答えは「理由」を説明する素晴らしい仕事をしましたが、文字列は可変長です)

ただし、文字列の場合、文字列の長さは固定されていません。

5
The Red Pea