個人的忘備録も兼ね、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