Pythonでのデバック：pandasで使えるデバック方法

# 概要
pandasを使用したデータ分析系システム現場での影響調査やデータ調査で使用してきたテクニックを以下にメモしておく。

# 目次
- 特定レコードを抽出する方法
- 重複のない値を取得する方法（unique）
- 重複データを検出する方法（duplicated）
- 欠損値を確認する方法（isnull）
- データフレームの分布を確認する方法（value_counts）
- データフレームの構造を確認する方法（info）

# pandas を使って顧客IDが一致するレコードを抽出・表示する
大量のレコードから特定の顧客IDが一致するレコードを抽出し、表示する方法を以下に示します。これはよく私が特定のレコードを調査する際に使用しています。
```python
import pandas as pd

# データを作成
data = {
    'customer_id': ['12345', '67890', '12345', '11111', '12345'],
    'order_amount': [250, 300, 150, 200, 100],
    'order_date': ['2023-09-01', '2023-09-02', '2023-09-03', '2023-09-04', '2023-09-05']
}

df = pd.DataFrame(data)

# 顧客IDが '12345' に一致するレコードを抽出
target_customer_id = '12345'
filtered_records = df[df['customer_id'] == target_customer_id]

# 抽出したレコードを表示
print(filtered_records)
```
以下のような出力結果が出てくる。
```
  customer_id  order_amount  order_date
0       12345           250  2023-09-01
2       12345           150  2023-09-03
4       12345           100  2023-09-05
```

# **unique()**で特定の列に存在するユニークな値（重複のない値）を取得する
デバッグ用途として、データに存在する特定のカラムの値の種類を確認する際に役立ちます。特定処理に通ってほしいレコードがあるかを確認したりします。
```python
import pandas as pd

# データを作成
data = {
    'customer_id': ['12345', '67890', '12345', '11111', '12345'],
    'order_amount': [250, 300, 150, 200, 100],
    'order_date': ['2023-09-01', '2023-09-02', '2023-09-03', '2023-09-04', '2023-09-05']
}

df = pd.DataFrame(data)

# 顧客IDのユニークな値を確認
unique_customer_ids = df['customer_id'].unique()
print("ユニークな顧客ID: ", unique_customer_ids)
```
以下のような出力結果が出てくる。
```
ユニークな顧客ID:  ['12345' '67890' '11111']
```

# **duplicated()**による重複データの検出
データに重複レコードが含まれているかどうかを確認し、問題のあるレコードを検出できます。
```python
import pandas as pd

# データを作成
data = {
    'customer_id': [101, 102, 101, 103, 104, 102, 101, 104, 103, 102],
    'order_amount': [250, 300, 250, 150, 500, 300, 250, 500, 150, 300]
}

df = pd.DataFrame(data)

# 重複している行を確認
duplicates = df[df.duplicated()]

print("重複しているレコード: \n", duplicates)
```
以下のような出力結果が出てくる。
```
重複しているレコード: 
   customer_id  order_amount
2          101           250
5          102           300
6          101           250
7          104           500
8          103           150
9          102           300
```
※重複したレコードをデータフレームから削除するには、drop_duplicates() メソッド使用すれば良い。

# **isnull()**による欠損値の確認
データセットに欠損値（NaN）が含まれていないかを確認できます。
```python
import pandas as pd

# データを作成（欠損値も含める）
data_with_missing = {
    'customer_id': ['12345', '67890', None, '11111', '12345'],
    'order_amount': [250, 300, 150, None, 100],
    'order_date': ['2023-09-01', None, '2023-09-03', '2023-09-04', None]
}

df_with_missing = pd.DataFrame(data_with_missing)

# 欠損値の確認
missing_values = df_with_missing.isnull().sum()
print("カラムごとの欠損値: \n", missing_values)
```
以下のような出力結果が出てくる。
```
カラムごとの欠損値: 
customer_id     1
order_amount    1
order_date      2
dtype: int64
```

# **value_counts()**によるデータの分布確認
特定のカラムに含まれる値の分布を確認できます。データの偏りや異常な値が見つかることがあります。
```python
import pandas as pd

# データを作成
data = {
    'customer_id': [101, 102, 101, 103, 104, 102, 101, 104, 103, 102],
    'order_amount': [250, 300, 200, 150, 500, 320, 180, 430, 100, 250]
}

df = pd.DataFrame(data)

# 顧客IDごとの件数をカウント
customer_counts = df['customer_id'].value_counts()

print("顧客IDごとの件数: \n", customer_counts)
```
以下のような出力結果が出てくる。
```
顧客IDごとの件数:
101    3
102    3
103    2
104    2
dtype: int64
```


# **info()**によるデータフレームの構造確認
```python
# データを作成（欠損値も含める）
data_with_missing = {
    'customer_id': ['12345', '67890', None, '11111', '12345'],
    'order_amount': [250, 300, 150, None, 100],
    'order_date': ['2023-09-01', None, '2023-09-03', '2023-09-04', None]
}
```
以下のようにデータフレームの情報を表示してくれます。
```
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   customer_id   4 non-null      object 
 1   order_amount  4 non-null      float64
 2   order_date    4 non-null      object 
dtypes: float64(1), object(2)
memory usage: 252.0+ bytes
```
- customer_id カラムは4つの非欠損値（object 型）。
- order_amount カラムは4つの非欠損値（float64 型）。
- order_date カラムは4つの非欠損値（object 型）。
- データフレームは全体で5行あり、各カラムに1つずつ欠損値があります。
- また、メモリ使用量が 252.0 バイトであることも表示されています。

上記がこれまでデータ分析系現場でのデータ調査で使用してきたテクニックです。