[Python] Pandas – DataFrameで行名や列名・値などでフィルタリングする方法
PandasのDataFrameでフィルタリングを行う方法はいくつかあります。
行名や列名でフィルタリングする場合、loc
やiloc
を使用します。
loc
はラベルベース、iloc
は位置ベースでのフィルタリングに適しています。
値でフィルタリングする場合、条件式を使ってフィルタリングが可能です。
例えば、df[df['列名'] > 値]
のように条件を指定します。
また、query()メソッド
を使ってSQLライクなフィルタリングも可能です。
行名でのフィルタリング
行名を指定してフィルタリングする方法
PandasのDataFrameでは、行名を指定して特定の行をフィルタリングすることができます。
以下のサンプルコードでは、行名を直接指定してフィルタリングを行います。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
index = ['行1', '行2', '行3']
df = pd.DataFrame(data, index=index)
# 行名を指定してフィルタリング
filtered_df = df.loc[['行1', '行3']]
print(filtered_df)
A B
行1 1 4
行3 3 6
このコードでは、locメソッド
を使用して、行名「行1」と「行3」を持つ行をフィルタリングしています。
行名の部分一致でフィルタリングする方法
行名の部分一致でフィルタリングするには、filterメソッド
を使用します。
以下のサンプルコードでは、行名に「行」という文字が含まれる行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
index = ['行1', '行2', '行3']
df = pd.DataFrame(data, index=index)
# 行名の部分一致でフィルタリング
filtered_df = df.filter(like='行')
print(filtered_df)
A B
行1 1 4
行2 2 5
行3 3 6
このコードでは、filterメソッド
のlike
引数を使用して、行名に「行」を含むすべての行を取得しています。
行名のリストを使ったフィルタリング
行名のリストを使ってフィルタリングすることも可能です。
以下のサンプルコードでは、行名のリストを指定してフィルタリングを行います。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
index = ['行1', '行2', '行3']
df = pd.DataFrame(data, index=index)
# 行名のリストを使ったフィルタリング
row_list = ['行2', '行3']
filtered_df = df.loc[row_list]
print(filtered_df)
A B
行2 2 5
行3 3 6
このコードでは、locメソッド
を使用して、行名のリストに基づいてフィルタリングを行っています。
行名の範囲指定でフィルタリングする方法
行名の範囲を指定してフィルタリングすることもできます。
以下のサンプルコードでは、行名の範囲を指定してフィルタリングを行います。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8]
}
index = ['行1', '行2', '行3', '行4']
df = pd.DataFrame(data, index=index)
# 行名の範囲指定でフィルタリング
filtered_df = df.loc['行2':'行4']
print(filtered_df)
A B
行2 2 6
行3 3 7
行4 4 8
このコードでは、locメソッド
を使用して、行名「行2」から「行4」までの範囲を指定してフィルタリングを行っています。
列名でのフィルタリング
列名を指定してフィルタリングする方法
PandasのDataFrameでは、列名を指定して特定の列をフィルタリングすることができます。
以下のサンプルコードでは、列名を直接指定してフィルタリングを行います。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
# 列名を指定してフィルタリング
filtered_df = df[['A', 'C']]
print(filtered_df)
A C
0 1 7
1 2 8
2 3 9
このコードでは、[['A', 'C']]
を使用して、列名 A
と C
を持つ列をフィルタリングしています。
複数の列名を指定してフィルタリングする方法
複数の列名を指定してフィルタリングする場合も、同様にリストを使って指定します。
以下のサンプルコードでは、複数の列名を指定してフィルタリングを行います。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
# 複数の列名を指定してフィルタリング
filtered_df = df[['A', 'B']]
print(filtered_df)
A B
0 1 4
1 2 5
2 3 6
このコードでは、[['A', 'B']]
を使用して、列名 A
と B
を持つ列をフィルタリングしています。
列名の部分一致でフィルタリングする方法
列名の部分一致でフィルタリングするには、filterメソッド
を使用します。
以下のサンプルコードでは、列名に A
という文字が含まれる列をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A1': [1, 2, 3],
'A2': [4, 5, 6],
'B': [7, 8, 9]
}
df = pd.DataFrame(data)
# 列名の部分一致でフィルタリング
filtered_df = df.filter(like='A')
print(filtered_df)
A1 A2
0 1 4
1 2 5
2 3 6
このコードでは、filterメソッド
のlike
引数を使用して、列名に A
を含むすべての列を取得しています。
列名のリストを使ったフィルタリング
列名のリストを使ってフィルタリングすることも可能です。
以下のサンプルコードでは、列名のリストを指定してフィルタリングを行います。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
# 列名のリストを使ったフィルタリング
column_list = ['B', 'C']
filtered_df = df[column_list]
print(filtered_df)
B C
0 4 7
1 5 8
2 6 9
このコードでは、column_list
を使用して、列名のリストに基づいてフィルタリングを行っています。
値を使ったフィルタリング
特定の値でフィルタリングする方法
特定の値を使ってDataFrameをフィルタリングするには、条件を指定して行を選択します。
以下のサンプルコードでは、列 A
の値が2である行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
df = pd.DataFrame(data)
# 特定の値でフィルタリング
filtered_df = df[df['A'] == 2]
print(filtered_df)
A B
1 2 5
このコードでは、df['A'] == 2
という条件を使って、列 A
の値が2である行を取得しています。
複数の値でフィルタリングする方法
複数の値を使ってフィルタリングする場合、isinメソッド
を使用します。
以下のサンプルコードでは、列 A
の値が1または3である行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
df = pd.DataFrame(data)
# 複数の値でフィルタリング
filtered_df = df[df['A'].isin([1, 3])]
print(filtered_df)
A B
0 1 4
2 3 6
このコードでは、isinメソッド
を使用して、列 A
の値が1または3である行を取得しています。
範囲指定でフィルタリングする方法
値の範囲を指定してフィルタリングするには、比較演算子を使用します。
以下のサンプルコードでは、列 A
の値が1以上3以下である行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8]
}
df = pd.DataFrame(data)
# 範囲指定でフィルタリング
filtered_df = df[(df['A'] >= 1) & (df['A'] <= 3)]
print(filtered_df)
A B
0 1 5
1 2 6
2 3 7
このコードでは、&
演算子を使用して、列 A
の値が1以上3以下である行を取得しています。
欠損値を含む行や列のフィルタリング
欠損値を含む行や列をフィルタリングするには、isnullメソッド
やnotnullメソッド
を使用します。
以下のサンプルコードでは、欠損値を含む行をフィルタリングします。
import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
'A': [1, 2, np.nan],
'B': [4, np.nan, 6]
}
df = pd.DataFrame(data)
# 欠損値を含む行のフィルタリング
filtered_df = df[df['A'].isnull()]
print(filtered_df)
A B
2 NaN 6.0
このコードでは、isnullメソッド
を使用して、列 A
に欠損値がある行を取得しています。
正規表現を使ったフィルタリング
正規表現を使ってフィルタリングするには、str.containsメソッド
を使用します。
以下のサンプルコードでは、列 A
に特定のパターンを含む行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': ['apple', 'banana', 'cherry'],
'B': [1, 2, 3]
}
df = pd.DataFrame(data)
# 正規表現を使ったフィルタリング
filtered_df = df[df['A'].str.contains('a')]
print(filtered_df)
A B
0 apple 1
1 banana 2
このコードでは、str.containsメソッド
を使用して、列 A
に a
を含む行を取得しています。
正規表現を使うことで、より複雑なパターンでのフィルタリングが可能です。
複数条件でのフィルタリング
AND条件でのフィルタリング
AND条件を使ってフィルタリングする場合、複数の条件を組み合わせて行を選択します。
以下のサンプルコードでは、列 A
の値が2以上かつ列 B
の値が5以上である行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [4, 5, 6, 7]
}
df = pd.DataFrame(data)
# AND条件でのフィルタリング
filtered_df = df[(df['A'] >= 2) & (df['B'] >= 5)]
print(filtered_df)
A B
1 2 5
2 3 6
3 4 7
このコードでは、&
演算子を使用して、列 A
が2以上かつ列 B
が5以上である行を取得しています。
OR条件でのフィルタリング
OR条件を使ってフィルタリングする場合、|
演算子を使用して複数の条件を組み合わせます。
以下のサンプルコードでは、列 A
の値が1または列 B
の値が6である行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [4, 5, 6, 7]
}
df = pd.DataFrame(data)
# OR条件でのフィルタリング
filtered_df = df[(df['A'] == 1) | (df['B'] == 6)]
print(filtered_df)
A B
0 1 4
2 3 6
このコードでは、|
演算子を使用して、列 A
が1または列 B
が6である行を取得しています。
NOT条件でのフィルタリング
NOT条件を使ってフィルタリングする場合、~
演算子を使用します。
以下のサンプルコードでは、列 A
の値が2でない行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [4, 5, 6, 7]
}
df = pd.DataFrame(data)
# NOT条件でのフィルタリング
filtered_df = df[~(df['A'] == 2)]
print(filtered_df)
A B
0 1 4
2 3 6
3 4 7
このコードでは、~
演算子を使用して、列 A
の値が2でない行を取得しています。
複数列を使った複雑な条件でのフィルタリング
複数列を使った複雑な条件でフィルタリングする場合、AND条件やOR条件を組み合わせて条件を設定します。
以下のサンプルコードでは、列 A
の値が2以上かつ列 B
の値が5未満、または列 A
の値が4である行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [4, 5, 6, 7]
}
df = pd.DataFrame(data)
# 複数列を使った複雑な条件でのフィルタリング
filtered_df = df[((df['A'] >= 2) & (df['B'] < 5)) | (df['A'] == 4)]
print(filtered_df)
A B
1 2 5
3 4 7
このコードでは、AND条件とOR条件を組み合わせて、複雑な条件でフィルタリングを行っています。
条件を適切に組み合わせることで、必要なデータを柔軟に取得することができます。
応用例
特定の文字列を含む行をフィルタリングする
特定の文字列を含む行をフィルタリングするには、str.containsメソッド
を使用します。
以下のサンプルコードでは、列 A
に apple
という文字列を含む行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'A': ['apple pie', 'banana split', 'apple tart', 'cherry tart'],
'B': [1, 2, 3, 4]
}
df = pd.DataFrame(data)
# 特定の文字列を含む行をフィルタリング
filtered_df = df[df['A'].str.contains('apple')]
print(filtered_df)
A B
0 apple pie 1
2 apple tart 3
このコードでは、列 A
に apple
を含む行を取得しています。
日付データを使ったフィルタリング
日付データを使ってフィルタリングする場合、pd.to_datetime
を使用して日付を変換し、条件を設定します。
以下のサンプルコードでは、特定の日付以降の行をフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'date': ['2023-01-01', '2023-02-01', '2023-03-01'],
'value': [10, 20, 30]
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
# 日付データを使ったフィルタリング
filtered_df = df[df['date'] >= '2023-02-01']
print(filtered_df)
date value
1 2023-02-01 20
2 2023-03-01 30
このコードでは、2023年2月1日以降の日付を持つ行を取得しています。
グループ化したデータのフィルタリング
グループ化したデータをフィルタリングするには、groupbyメソッド
を使用し、集約関数を適用します。
以下のサンプルコードでは、各グループの合計が特定の値以上のグループをフィルタリングします。
import pandas as pd
# サンプルデータの作成
data = {
'category': ['A', 'A', 'B', 'B', 'C'],
'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# グループ化したデータのフィルタリング
grouped = df.groupby('category').sum()
filtered_df = grouped[grouped['value'] >= 50]
print(filtered_df)
value
category
B 70
C 50
このコードでは、各カテゴリの合計値が50以上のグループを取得しています。
重複データを除外したフィルタリング
重複データを除外するには、drop_duplicatesメソッド
を使用します。
以下のサンプルコードでは、重複した行を除外します。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 2, 3],
'B': [4, 5, 5, 6]
}
df = pd.DataFrame(data)
# 重複データを除外
filtered_df = df.drop_duplicates()
print(filtered_df)
A B
0 1 4
1 2 5
3 3 6
このコードでは、重複した行を除外してユニークな行のみを取得しています。
インデックスをリセットしてフィルタリング結果を保存する
フィルタリング結果を保存する際にインデックスをリセットするには、reset_indexメソッド
を使用します。
以下のサンプルコードでは、フィルタリング後にインデックスをリセットします。
import pandas as pd
# サンプルデータの作成
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8]
}
df = pd.DataFrame(data)
# フィルタリング
filtered_df = df[df['A'] > 2]
# インデックスをリセット
filtered_df = filtered_df.reset_index(drop=True)
print(filtered_df)
A B
0 3 7
1 4 8
このコードでは、フィルタリング後にインデックスをリセットし、元のインデックスを削除しています。
これにより、フィルタリング結果が見やすくなります。
まとめ
この記事では、Pandasを使用したDataFrameのフィルタリング方法について、行名や列名、値、複数条件、応用例などを詳しく解説しました。
これにより、データの選択や操作がより効率的に行えるようになります。
今後は、実際のデータ分析や処理において、これらのフィルタリング技術を活用し、データの洞察を深めていくことをお勧めします。