2024年7月3日水曜日

pandasのスライスが使えないエラー

データフレームのスライス使用時の注意

pd.__version__: 2.1.4

データフレームを使用していたらスライスが使えない現象が出ました。

import numpy as np
import pandas as pd

# float型のインデックス
ind = [1.0, 2.0, 3.0]

df = pd.DataFrame({
    "col1": ["A", "B", "C"],
    "col2": [11, 22, 33]
}, index=ind)

print(df)

# ここでワーニング
print(df[1:2])

    col1  col2

1.0    A    11

2.0    B    22

3.0    C    33


内容としては

FutureWarning: The behavior of obj[i:j] with a float-dtype index is deprecated. In a future version, this will be treated as positional instead of label-based. For label-based slicing, use obj.loc[i:j] instead

のワーニングが出てスライスが出来ません。

ワーニングの内容によると、float-dtype のインデックスは今後使えなくなるそうです。
代替としてobj.loc[i:j]で指定してくださいとあります。
ただし、floatのままだと処理が遅くなるようなので根本的に解決するならint型に直したほうがよさそうです。

直接インデックスの型を変えられない様なので、一旦インデックスを解除し、型をintに変更してからまた振り直します。


# インデックスの解除
df.reset_index(inplace=True)

# 型をindexに変更
df2 = df.astype({"index": int})

# インデックスの振り直し
df2.set_index("index", inplace=True)

print(df2)
print(df2.dtypes)


      col1  col2
index           
1        A    11
2        B    22
3        C    33

col1    object
col2     int64
dtype: object

これでスライスも使えるようになります。

0 件のコメント:

コメントを投稿

Pythonで地図空間データを扱う⑤

ベースの地図が出来た所で、他のデータを被せてみます。 国土地理院の  500mメッシュ別将来推計人口データ  を使用します。 同じく神奈川県のデータ  500m_mesh_suikei_2018_shape_14.zip をダウンロードします。 ベースの地図データと同じ場所に展開...