1. ホーム
  2. python

[解決済み] DataFrameの文字列、dtypeがobjectの場合

2022-07-08 18:32:16

質問

選択された列のすべての項目が文字列であるにもかかわらず、なぜ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 であり、これは正しい。

Pandasは int64float64 そして object . がない場合、どのようなロジックになるのでしょうか? dtype str ? なぜ str でカバー object ?

どのように解決するのですか?

この dtype オブジェクトはNumPyから来たもので、これは ndarray . の中のすべての要素は ndarray の各要素は同じバイト数でなければなりません。例えば int64float64 のように、8バイトである。しかし、文字列の場合、文字列の長さは一定ではありません。そこで、文字列のバイト数を保存する代わりに ndarray に直接保存するのではなく、Pandasはオブジェクト ndarray で、これはオブジェクトへのポインタを保存します。 dtype のような ndarray はオブジェクトです。

以下はその例である。

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