はじめに
本記事では、SQLと同等の動きをするpandasの記述方法をまとめます。
記事の方針
pandasを学習している際に、動作が似ていて、普段使用しているSQLに紐づけることで記憶に残るのではないかと考えました。
そのため、普段SQLで使用する操作をpandasではどのように記述するのかという視点でまとめていきたいと思います。
使用データ
本記事では以下のデータを使用します。
拾ったお金の情報を記したものとしてみてください。
以下データは、SQLではtblテーブル、pandasではtbl.csvとして操作するものとします。
ymd | name | money |
---|---|---|
2023/02/01 | Sato | 10000 |
2023/02/01 | Tanaka | 3100 |
2023/02/01 | Aoki | 8800 |
2023/02/02 | Sato | 2000 |
2023/02/02 | Tanaka | 9300 |
2023/02/02 | Aoki | 12000 |
2023/02/03 | Sato | 2000 |
2023/02/03 | Tanaka | 10000 |
2023/02/03 | Aoki | 10000 |
2023/02/04 | Sato | 5800 |
2023/02/04 | Tanaka | 1000 |
2023/02/04 | Aoki | 7500 |
前提
以降、下記操作を前提とします。
import pandas as pd
df = pd.read_csv('tbl.csv')
SELECT
全件
- SQL
SELECT *
FROM tbl;
- pandas
print(df)
列指定
- SQL
SELECT ymd, money
FROM tbl;
- pandas
df[['ymd', 'money']]
条件指定
等価条件
- SQL
SELECT *
FROM tbl
WHERE name = 'Sato';
- pandas
df[df['name'] == 'Sato']
比較条件
- SQL
SELECT *
FROM tbl
WHERE money < 9000;
- pandas
df[df['money'] < 9000]
複数条件
- SQL
SELECT *
FROM tbl
WHERE ymd <> '2023/02/03' and name <> 'Aoki';
- pandas
df[(df['ymd'] != '2023/02/03') & (df['name'] != 'Aoki')]
※pandasの複数条件指定では、条件ごとに括弧で括る
UPDATE
- SQL
UPDATE tbl
SET money = 0
WHERE ymd < '2023/02/02' or name = 'Sato';
- pandas
df['money'] = df['money'].where((df['ymd'] < '2023/02/02') | (df['name'] == 'Sato'), 0)
INSERT
- SQL
INSERT INTO tbl
VALUES('2023/02/05', 'Sato', 20000);
- pandas
df2 = pd.Series(['2023/02/05', 'Sato', 20000], name=0, index=['ymd', 'name', 'money']) # 追加する行を作成
df = df.append(df2) # 行追加
df = df.reset_index(drop=True) # インデックス番号を連番に変更
※pandasでは、追加する行のインデックスを仮置きで0としている。
DELETE
全削除
- SQL
DELETE tbl;
- pandas
df = df.drop(range(len(df)))
行削除
- SQL
DELETE tbl
WHERE money < 10000;
- pandas
df = df[df['money'] >= 10000]
最後に
よりスマートなpandasの記述方法があると感じました。
また、SQLの操作はまだまだ存在するため、随時紐づけ
参考文献