web-dev-qa-db-ja.com

パンダ:dtype 'object'をintに変換します

SQLクエリをPandasに読み込んだところ、値は文字列、日付、整数ですが、dtype 'object'として入力されています。日付の「オブジェクト」をPandas datetime dtypeに変換できますが、文字列と整数を変換しようとするとエラーが発生します。

以下に例を示します。

>>> import pandas as pd
>>> df = pd.read_sql_query('select * from my_table', conn)
>>> df
    id    date          purchase
 1  abc1  2016-05-22    1
 2  abc2  2016-05-29    0
 3  abc3  2016-05-22    2
 4  abc4  2016-05-22    0

>>> df.dtypes
 id          object
 date        object
 purchase    object
 dtype: object

df['date']を日時に変換することは機能します。

>>> pd.to_datetime(df['date'])
 1  2016-05-22
 2  2016-05-29
 3  2016-05-22
 4  2016-05-22
 Name: date, dtype: datetime64[ns] 

しかし、df['purchase']を整数に変換しようとするとエラーが発生します。

>>> df['purchase'].astype(int)
 ....
 pandas/lib.pyx in pandas.lib.astype_intsafe (pandas/lib.c:16667)()
 pandas/src/util.pxd in util.set_value_at (pandas/lib.c:67540)()

 TypeError: long() argument must be a string or a number, not 'Java.lang.Long'

注:.astype('float')を試したときに同様のエラーが表示されます

そして、文字列に変換しようとしても、何も起こらないようです。

>>> df['id'].apply(str)
 1 abc1
 2 abc2
 3 abc3
 4 abc4
 Name: id, dtype: object
36
cyril

@piRSquaredのコメントに基づいて、私のために働いた答えを文書化します。

最初に文字列に変換し、次に整数に変換する必要がありました。

>>> df['purchase'].astype(str).astype(int)
51
cyril

次の手順を実行します:

1.ファイルをクリーンアップ->データファイルをcsv形式で開き、「?」があることを確認します空の場所の代わりにそれらをすべて削除します。

2.欠損値を含む行をドロップします、例:

df.dropna(subset=["normalized-losses"], axis = 0 , inplace= True)

3. astypeを今すぐ変換に使用する

df["normalized-losses"]=df["normalized-losses"].astype(int)

注:プログラムでまだエラーを検出している場合は、csvファイルを再度検査し、Excelで開いて「?」があるかどうかを確認します。必要な列で、削除してファイルを保存し、戻ってプログラムを実行します。

コメント成功!それが機能する場合。 :)

2
mandeep

それは簡単です

pd.factorize(df.purchase)[0]

例:

labels, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])`
labels
# array([0, 0, 1, 2, 0])
uniques
# array(['b', 'a', 'c'], dtype=object)
1
Kariru

私の列車データには、astypeを適用した後、オブジェクトを数値に変換する3つの機能が含まれていますが、その前に、いくつかの前処理ステップを実行する必要があります

train.dtypes

C12       object
C13       object
C14       Object

train['C14'] = train.C14.astype(int)

train.dtypes

C12       object
C13       object
C14       int32
0