marcopagot
@marcopagot (Asuka)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DataFrame内の特定カラムの型(type)を変換したい

解決したいこと

DataFrame内の特定カラムの型(type)を変換したい。

現状)
閲覧頂きありがとうございます。python初学者です。
現在、suumoの不動産データを用いて賃貸物件の家賃予測をしようとしています。
まず、floor(物件の所在階)の特徴量を作成しようとしているのですが、その段階でエラーが出ています。

データの確認

train.head(1)
    title   category    address access  age floor   fee management_fee  deposit gratuity    madori  menseki
0   東京タワーズミッドタワー  賃貸マンション   東京都中央区勝どき6  \n都営大江戸線/勝どき駅 歩5分\n東京メトロ有楽町線/月島駅 歩14分\n東京メトロ日比... \n築14年\n地下2地上58階建\n [12]    17.5万円  15000    35万円    17.5万円  1LDK    51.78m2
train['floor'].head()
0    [12]
1    [10]
2    [11]
3    [13]
4    [20]
Name: floor, dtype: object

上記のように['floor']の中には、objectタイプでその物件の階数が表示されています。
私は1.[ ]を取りたい。2.タイプをobjectではなく数値(int)型にしたいと考えております。

自分で試したこと。

下記URLを参考に、astypeを用いて変換しようとしています。
https://note.nkmk.me/python-pandas-dtype-astype/

該当するソースコード

train = train.astype({'floor': 'int8'})
print(train)

エラー

ValueError: setting an array element with a sequence.

'int8'のシングルコーテーションを外したり、ただのintにしてもダメでした、、、
①どのようにしたら数値型に変換できるか。
②int8、int16、int64どれにするべきなのか。
上記2点に関して、解決方法をご存知の方がいらっしゃいましたら
ご教示の程宜しくお願い致します。

0

1Answer

floorの値が1つのみの値を必ず持つリストになっている・・・といったデータになっている前提ですが、1例としてapplyメソッドを使って以下のような対応ができます!(floor_intというカラムを追加する形でやっています。詳細はコード内のコメントで記載しました)

import pandas as pd

# ダミーデータとして固定値のデータフレームを設定しています。
df: pd.DataFrame = pd.DataFrame(
    data={'floor': [[12], [10], [11], [13], [20]]})

# applyメソッドでラムダ式(無名関数)やもしくは他の関数を特定列の
# 値に反映することができます。このサンプルではxは[12]や[10]といった
# floorカラムの各行の値になります。x[0]でリスト内の先頭の値を返却しています。
df['floor_int'] = df['floor'].apply(lambda x: x[0])

print(df)
  floor  floor_int
0  [12]         12
1  [10]         10
2  [11]         11
3  [13]         13
4  [20]         20

もしデータが入っていない(欠損値や空のリストが含まれている)みたいなケースではエラーになってしまうため、以下のようにlambdaではなく普通の関数を指定してif文とかで判定してNoneなりnp.nanなどを返却する・・・的な制御が必要になるかと思われます!

import pandas as pd
import numpy as np

# 欠損値を含んだダミーデータとして固定値のデータフレームを設定しています。
df: pd.DataFrame = pd.DataFrame(
    data={'floor': [[12], [10], [11], None, [13], np.nan, [20], []]})


def get_int_or_nan(x):

    # nanなどの値はisnullで判定できるので、その場合はx[0]といったアクセスを
    # するとエラーになるため欠損値はそのまま返却しています。
    if pd.isnull(x):
        return x

    # 空のリストなどはnotで判定ができるため、空のリストの場合には
    # 欠損値のnanを返却するようにしています。適宜必要なものにご調整ください。
    if not x:
        return np.nan

    return x[0]


df['floor_int'] = df['floor'].apply(get_int_or_nan)
print(df)
0  [12]       12.0
1  [10]       10.0
2  [11]       11.0
3  None        NaN
4  [13]       13.0
5   NaN        NaN
6  [20]       20.0
7    []        NaN
0Like

Your answer might help someone💌