Day 37:pandasデータ加工で「欲しい形に整える力」を身につける
Day 37では、pandasを使って データを思い通りの形に加工する ことを目標にします。 業務自動化では、「データを読み込むだけ」ではなく、必要な列だけ取り出す・条件で絞る・並べ替える・欠損値を処理する・型を揃える といった加工が必須になります。
扱うキーワードは次の6つです。
- 列選択
- 行選択
- 条件抽出
- ソート
- 欠損値
- 型変換
ここでは、初心者向けにかみ砕いて、 「よくある業務データ」を例にしながら、ステップバイステップで説明していきます。
サンプルデータの準備:少し“業務っぽい”CSVを作る
まずは、Day 37で使うサンプルCSVを作ります。 売上データに、わざと欠損値や文字列の数値を混ぜておきます。
# day37_make_csv.py
def create_sample_csv(filename="sales_day37.csv"):
"""Day 37用のサンプルCSVファイルを作成する関数です。"""
content = """日付,店舗,商品名,数量,単価,売上
2024-01-01,A,りんご,10,120,1200
2024-01-01,B,みかん,8,100,800
2024-01-01,C,ぶどう,,300,
2024-01-02,A,りんご,5,120,600
2024-01-02,B,みかん,abc,100,1000
2024-01-02,C,ぶどう,3,300,900
"""
with open(filename, "w", encoding="utf-8") as f:
f.write(content)
print(f"{filename} を作成しました。")
if __name__ == "__main__":
create_sample_csv()
Pythonポイント:
- 3行目の「数量」と「売上」が空欄(欠損値)になっています。
- 5行目の「数量」が
abcという文字列になっていて、数値として扱えません。
このような「きれいではないデータ」を、pandasで整えていきます。
基本:CSVを読み込んでDataFrameを確認する
import pandas as pd
def load_data():
"""CSVを読み込んで基本情報を確認する例です。"""
df = pd.read_csv("sales_day37.csv")
print("=== 読み込んだDataFrame ===")
print(df)
print("\n=== 列のデータ型 ===")
print(df.dtypes)
print("\n=== 行数・列数 ===")
print(df.shape)
return df
if __name__ == "__main__":
load_data()
Pythonここでのポイント:
pd.read_csv()でCSVをDataFrameとして読み込んでいること。df.dtypesで各列の型を確認できること(数量や単価が「object」になっている場合があります)。
列選択:必要な列だけに絞る
1列だけ選ぶ
import pandas as pd
def select_columns_example():
df = pd.read_csv("sales_day37.csv")
# 「商品名」列だけを取り出します。
product_series = df["商品名"]
print("=== 商品名列(Series) ===")
print(product_series)
if __name__ == "__main__":
select_columns_example()
Python複数列を選ぶ
import pandas as pd
def select_multiple_columns_example():
df = pd.read_csv("sales_day37.csv")
# 「日付」「店舗」「売上」だけを取り出します。
selected_df = df[["日付", "店舗", "売上"]]
print("=== 日付・店舗・売上だけのDataFrame ===")
print(selected_df)
if __name__ == "__main__":
select_multiple_columns_example()
Pythonポイント:
df["列名"]で1列、df[["列名1", "列名2"]]で複数列を選択できること。- 不要な列を捨てて、必要な列だけに絞ることで、処理対象をシンプルにできること。
行選択:特定の行・範囲を取り出す
行番号で選ぶ(iloc)
import pandas as pd
def select_rows_by_position():
df = pd.read_csv("sales_day37.csv")
print("=== 先頭3行(行番号で選択) ===")
print(df.iloc[0:3]) # 0〜2行目
if __name__ == "__main__":
select_rows_by_position()
Python行ラベルで選ぶ(loc)
loc は「行ラベル」で選ぶためのものですが、 CSV読み込み直後は行ラベルが0,1,2,…なので、iloc と似た使い方になります。
import pandas as pd
def select_rows_by_label():
df = pd.read_csv("sales_day37.csv")
print("=== 行ラベル 2〜4 を選択 ===")
print(df.loc[2:4]) # 2〜4行目
if __name__ == "__main__":
select_rows_by_label()
Pythonポイント:
ilocは「位置(0から始まるインデックス)」で選ぶ。locは「ラベル」で選ぶが、初期状態ではラベル=インデックス番号になっていることが多い。
条件抽出:条件に合う行だけを絞り込む
店舗Aだけを抽出する
import pandas as pd
def filter_by_store():
df = pd.read_csv("sales_day37.csv")
# 店舗が "A" の行だけを抽出します。
df_a = df[df["店舗"] == "A"]
print("=== 店舗Aのデータ ===")
print(df_a)
if __name__ == "__main__":
filter_by_store()
Python売上が1000以上の行だけを抽出する
欠損値や文字列が混ざっているときは、まず型を整える必要がありますが、 ここでは一旦「売上列が数値として読み込まれている」前提で説明します。
import pandas as pd
def filter_by_sales():
df = pd.read_csv("sales_day37.csv")
# 売上が1000以上の行だけを抽出します。
df_high = df[df["売上"] >= 1000]
print("=== 売上が1000以上のデータ ===")
print(df_high)
if __name__ == "__main__":
filter_by_sales()
Pythonポイント:
df[条件式]という形で、条件に合う行だけを抽出できること。- 条件式は「列に対する比較」を書く(例:
df["売上"] >= 1000)。
ソート:並べ替えで「見やすさ」と「分析しやすさ」を上げる
売上の降順で並べ替える
import pandas as pd
def sort_by_sales():
df = pd.read_csv("sales_day37.csv")
# 売上列で降順(大きい順)に並べ替えます。
df_sorted = df.sort_values(by="売上", ascending=False)
print("=== 売上の降順でソートしたDataFrame ===")
print(df_sorted)
if __name__ == "__main__":
sort_by_sales()
Python日付→店舗の複数キーでソートする
import pandas as pd
def sort_by_date_and_store():
df = pd.read_csv("sales_day37.csv")
# 日付昇順、店舗昇順で並べ替えます。
df_sorted = df.sort_values(by=["日付", "店舗"], ascending=[True, True])
print("=== 日付→店舗でソートしたDataFrame ===")
print(df_sorted)
if __name__ == "__main__":
sort_by_date_and_store()
Pythonポイント:
sort_values(by="列名")で特定列を基準に並べ替えできること。by=["列1", "列2"]のように複数列を指定して、複数キーでソートできること。
欠損値:空欄やNaNをどう扱うか
欠損値の確認
import pandas as pd
def check_missing_values():
df = pd.read_csv("sales_day37.csv")
print("=== 欠損値の有無 ===")
print(df.isna()) # True が欠損値
print("\n=== 列ごとの欠損値数 ===")
print(df.isna().sum()) # 列ごとの欠損数
if __name__ == "__main__":
check_missing_values()
Python欠損値を除外する(dropna)
import pandas as pd
def drop_missing_rows():
df = pd.read_csv("sales_day37.csv")
# 欠損値を含む行を丸ごと削除します。
df_clean = df.dropna()
print("=== 欠損値を含む行を削除したDataFrame ===")
print(df_clean)
if __name__ == "__main__":
drop_missing_rows()
Python欠損値を埋める(fillna)
import pandas as pd
def fill_missing_values():
df = pd.read_csv("sales_day37.csv")
# 数量の欠損値を0で埋めます。
df["数量"] = df["数量"].fillna(0)
# 売上の欠損値を0で埋めます。
df["売上"] = df["売上"].fillna(0)
print("=== 欠損値を0で埋めたDataFrame ===")
print(df)
if __name__ == "__main__":
fill_missing_values()
Pythonポイント:
isna()で欠損値をTrue/Falseで確認できること。dropna()で欠損値を含む行を削除できること。fillna(値)で欠損値を特定の値で埋めることができること。
型変換:文字列の数値を「本物の数値」にする
数量列を数値に変換する(エラーはNaNに)
import pandas as pd
def convert_types():
df = pd.read_csv("sales_day37.csv")
print("=== 変換前の型 ===")
print(df.dtypes)
# 数量列を数値に変換します。変換できないものは NaN になります。
df["数量"] = pd.to_numeric(df["数量"], errors="coerce")
# 単価列も数値に変換します。
df["単価"] = pd.to_numeric(df["単価"], errors="coerce")
# 売上列も数値に変換します。
df["売上"] = pd.to_numeric(df["売上"], errors="coerce")
print("\n=== 変換後の型 ===")
print(df.dtypes)
print("\n=== 型変換後のDataFrame ===")
print(df)
if __name__ == "__main__":
convert_types()
Pythonここでのポイント:
pd.to_numeric(列, errors="coerce")で、数値に変換できない値をNaNにできること。- 文字列の数値(”10″ など)を「本物の数値」に変換することで、計算が可能になること。
型変換+欠損値処理+計算の流れをまとめる
「数量 × 単価 → 売上」を再計算する
import pandas as pd
def clean_and_recalculate():
df = pd.read_csv("sales_day37.csv")
# 型変換
df["数量"] = pd.to_numeric(df["数量"], errors="coerce")
df["単価"] = pd.to_numeric(df["単価"], errors="coerce")
df["売上"] = pd.to_numeric(df["売上"], errors="coerce")
# 欠損値を0で埋める(数量・単価)
df["数量"] = df["数量"].fillna(0)
df["単価"] = df["単価"].fillna(0)
# 売上を再計算(数量 × 単価)
df["売上"] = df["数量"] * df["単価"]
print("=== 整形後のDataFrame(売上再計算済み) ===")
print(df)
if __name__ == "__main__":
clean_and_recalculate()
Pythonポイント:
- 型変換 → 欠損値処理 → 計算、という順番が大事であること。
- 「汚いデータ」を「計算可能なきれいなデータ」に変える流れを作っていること。
Day 37ミニテンプレート:pandasデータ加工まとめスクリプト
最後に、Day 37で扱った要素を一通り試せるテンプレートを示します。
# day37_pandas_processing.py
import pandas as pd
def load_data(filename="sales_day37.csv"):
df = pd.read_csv(filename)
print("=== 読み込んだDataFrame ===")
print(df)
return df
def process_data(df):
# 型変換
df["数量"] = pd.to_numeric(df["数量"], errors="coerce")
df["単価"] = pd.to_numeric(df["単価"], errors="coerce")
df["売上"] = pd.to_numeric(df["売上"], errors="coerce")
# 欠損値処理
df["数量"] = df["数量"].fillna(0)
df["単価"] = df["単価"].fillna(0)
df["売上"] = df["売上"].fillna(0)
# 売上再計算
df["売上"] = df["数量"] * df["単価"]
# 条件抽出:売上が1000以上
df_high = df[df["売上"] >= 1000]
# ソート:売上降順
df_sorted = df_high.sort_values(by="売上", ascending=False)
print("=== 整形後のDataFrame ===")
print(df)
print("\n=== 売上1000以上(降順ソート) ===")
print(df_sorted)
return df_sorted
def main():
df = load_data()
process_data(df)
if __name__ == "__main__":
main()
PythonDay 37のまとめ
Day 37では、pandasデータ加工として、
- 列選択・行選択で「必要な部分だけ」を取り出す方法
- 条件抽出で「店舗Aだけ」「売上1000以上だけ」といった絞り込みを行う方法
- ソートで「売上の降順」「日付→店舗」のように並べ替える方法
- 欠損値(NaN)を確認し、削除したり特定の値で埋めたりする方法
- 型変換で、文字列の数値を「本物の数値」に変えて計算可能にする方法
- 型変換+欠損値処理+再計算という、実務でよくある整形の流れ
をステップバイステップで体験していただきました。
ここまで来ると、pandasを使って 「現場から渡される少し汚れたデータ」を整えて、欲しい形に加工する という感覚がかなり育っているはずです。 次のステップでは、グループ化や集計など、さらに一歩進んだデータ分析・業務自動化に進んでいきます。
