LoginSignup
1
5

More than 3 years have passed since last update.

Pandasによるデータ処理Tips

Last updated at Posted at 2020-08-15

個人的忘備録も兼ね、Pandasによるデータ処理のTipsです。
ググっても引っかからなかったものを書き留めています。
どんどん追加していく予定です。
間違いや改善点等ありましたらお知らせいただけますと幸いです。

まず見るべきはチートシート

和訳してくださった方に圧倒的感謝。
https://qiita.com/s_katagiri/items/4cd7dee37aae7a1e1fc0

複数の変数に関数を適用し、返り値を別の変数に保存する。

例: x1の中に含まれる「@」の個数をcnt_x1に入れる、というのをx2,x3,...についても行う。
x1→cnt_x1, ..., x13→cnt_x13

migs = {'cnt_x1': 'x1', 'cnt_x2': 'x2', ...,  'cnt_x13': 'x13'}

for vars, mig in migs.items():
    df1[vars] = df1[mig].str.count('@')
  • keys(): 各要素のキーkeyに対してforループ処理
  • values(): 各要素の値valueに対してforループ処理
  • items(): 各要素のキーkeyと値valueに対してforループ処理

辞書を使用する。辞書のkeyとvalueの対応は以下のとおりである。
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

データフレームの列に対して1対1の変換を施す

def income(x):
    if x == 1:
        return 100
    elif x == 2:
        return 300
    elif x == 3:
        return 500

df['x1'] = df['x1'].apply(income)

全カラムに対して関数適用


for col in df:
    df.loc[:, col] = df.loc[:, col].apply(lambda x: 1 if x == 1 else 0) 

postgresにクエリを投げてデータフレーム化(ヘッダも取得)旧

cur.execute()の中に'''で囲んだクエリを記述。
個人的には(Postgresの際は)PgAdminで動きを確かめてから記述。

import psycopg2
import pandas as pd
conn = psycopg2.connect("host=hostname  user=username port=port dbname=dbname password=password")
# execute sql
cur = conn.cursor()
#スキーマ名.テーブル名
cur.execute('''
select *
from hoge
;''')
results = cur.fetchall()
#dfにしたい
df = pd.DataFrame(results, columns=[col.name for col in cur.description])
cur.close()
conn.close()

postgresにクエリを投げてデータフレーム化(ヘッダも取得)新

withを使うとSQL実行中にエラー等起きても
データベースが固まったままにならない。

import psycopg2
import pandas as pd
import pandas.io.sql as psql

def get_connection(server, db):
    return psycopg2.connect(host=server, port=5432, database=db, user="user", password='pass')

with get_connection(dbname, db) as conn:
    df = psql.read_sql(sql, conn)

PostgreSQLにinsertする

conn.autocommit = True
が必要

with get_connection() as conn:
    conn.autocommit = True
    with conn.cursor() as cur:
        cur.execute('INSERT INTO users (name) VALUES (%s)', ('foo',))

空のファイルを作り、ファイル名に現段階のサンプル数を書き出して状況を把握する方法

上のpostgresにクエリを投げ、データフレーム化をするプログラムと組み合わせ、Windowsのタスクスケジューラで定期実行されるようにすると、毎日(毎週、毎時間など好きなスパン)のデータベース内のサンプルの状況を把握することができる。

allcnt = len(df)

with open(r"./日付" + str(date) +  r"_計_" + str(allcnt) + r"_国内_" + str(domestic) + r"_海外_" + str(foreign) + r".txt","w"):pass

id一覧のエクセルファイルを読み込んで、sqlのwhere句で操作する


# shift-jis のCSVファイル
with open(in_file, 'r', encoding='CP932', errors='ignore') as csv_file:
# 行毎に読込
    for row in csv.reader(csv_file):
        id_list.append(row[1])


del id_list[0]
id_str = "'" + "','".join(id_list) + "'"

###pandasで作成
import pandas as pd
df = pd.read_excel(output_path + r'\\ID一覧.xlsx',dtype=object).dropna(subset = ['x1'])
id_list = []
id_list = df.x1.tolist()
id_str = "'" + "','".join(id_list) + "'"

sql = """
select * from hoge
where id in (
{0}
);
""".format(id_str)

#以下でpsycopg2で実行

参考にさせていただいたページ

https://qiita.com/hoto17296/items/0ca1569d6fa54c7c4732
https://qiita.com/stokes/items/157f7ab737c5ded26832
https://qiita.com/knoguchi/items/3d5631505b3f08fa37cc

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5