PythonのPandasで「範囲指定して行を削除する」方法にはいくつかのアプローチがあります。
どの方法を使うかは、「範囲」とは何を意味するかによって異なります。
以下では、それぞれのケースについて丁寧に解説していきます。
目次
想定される「範囲指定」とは?
- インデックスでの範囲指定(行番号ベース)
- 列の値での範囲指定(値ベース)
- 日時やカテゴリでの範囲指定(条件ベース)
それぞれについて、具体例付きで説明します。
インデックスで範囲指定して行削除
たとえば、DataFrameの2行目から4行目までを削除したい場合
import pandas as pd
# サンプルデータ
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'Age': [24, 27, 22, 32, 29]
})
# インデックス2から4未満(2,3)の行を削除
df_dropped = df.drop(df.index[2:4])
print(df_dropped)
解説
df.index[2:4]
でインデックスのスライスを取得.drop(...)
で該当のインデックス行を削除- 元の
df
は変更されず、新しいdf_dropped
が生成されます
列の値に基づいて範囲指定し行削除
たとえば、Ageが25歳以上30歳未満の人を削除したい場合
# 条件を指定
condition = (df['Age'] >= 25) & (df['Age'] < 30)
# 条件に合致する行を削除
df_filtered = df[~condition] # ~ はNOT演算子
print(df_filtered)
解説
(df['Age'] >= 25) & (df['Age'] < 30)
:範囲条件を作成~condition
:その条件に当てはまらない行を抽出- 結果として、該当する範囲の値を持つ行が削除されたDataFrameが得られます
日付で範囲指定して削除(タイムスタンプベース)
日時をインデックスにして、特定期間の行を削除したいとき
# 日付インデックスのDataFrameを作成
date_rng = pd.date_range(start='2024-01-01', end='2024-01-10', freq='D')
df = pd.DataFrame({'value': range(len(date_rng))}, index=date_rng)
# 2024-01-03〜2024-01-06 の範囲を削除
df_dropped = df.drop(df.loc['2024-01-03':'2024-01-06'].index)
print(df_dropped)
解説
df.loc['start':'end']
で日付の範囲を取得- その
.index
をdrop()
に渡して行削除
特定のインデックスのリストで削除
手動で削除したいインデックスがある場合は、リストで指定できます。
# インデックス2番と4番を削除
df_dropped = df.drop([2, 4])
print(df_dropped)
inplace=True
で元のDataFrameに反映
drop()
は通常、新しいDataFrameを返すだけで、元のDataFrameには影響しません。
しかし、inplace=True
を指定すると、元のDataFrame自体が直接更新されて、行が削除されます。
df.drop(df.index[1:3], inplace=True)
print(df) # 変更が反映されている
まとめ
範囲指定の仕方 | 使う方法 | 使用例 |
---|---|---|
行番号で指定 | df.drop(df.index[start:end]) | インデックス2〜4の行削除 |
値で範囲指定 | df[~条件] | Ageが25〜30の行削除 |
日時で指定 | df.drop(df.loc[start:end].index) | ある期間の行を削除 |
リスト指定 | df.drop([index1, index2]) | 任意の行番号を削除 |
以上、PythonのPandasで範囲指定して行削除をする方法についてでした。
最後までお読みいただき、ありがとうございました。