Python
pandas

pandasのお作法色々

データの集計や加工で使うリスト
ふとした時に更新していく予定

pandasをインポート

デフォでpandasはpd, data frameはdfにしてる

import pandas as pd

データフレームを最初から作る

ランダム値から入る使用はネットに色々載ってるが、空の状態から追加していきたい時が多々ある

cnt = 100 # レコード数
df = pd.DataFrame(index=[i for i in range(cnt)], columns=['column_name'], data=0)

# レコード数が分からない時
df = pd.DataFrame(index=[0], columns=['column_name'], data=0)

# その後で分かった時
cnt = 100
df = df.reindex([i for i in range(cnt)])

# 一個追加の時
# atが速い https://github.com/pandas-dev/pandas/issues/6683#issuecomment-38305770
df.at[max(df.index)+1, 'column_name'] = 0
df.loc[max(df.index)+1, 'column_name'] = 0

何かしらのデータをpandasで読み込む

# csv
# encoding指定する場合、大抵'utf-8', 'cp932', 'utf-8-sig'で落ち着く
df = pd.read_csv('filename.csv', encoding='utf-8', dtype={'column_a': str, 'column_b': int})

# DB(mysql)
import pymysql
con = (
    host='hostname',
    user='user',
    password='password',
    db='dbname',
    charset='utf-8'
)
df = pd.read_sql(con, 'select * from table')

# Excel
# sheetnameとconvertersはオプション
df = pd.read_excel('filename.xlsx', sheetname='Sheet1', converters={'column_a': str})

カラムを追加したい時

# 例: 'add_column_name'というカラムを追加し、値にhogeを入れる
df['add_column_name'] = 'hoge'

# 例: 年齢層を年齢から取得
bins = list(range(0, 101, 10)) + [999]
labels = ['10歳未満'] + ["%d0代" % i for i in range(1, 10)] + ['100歳以上 私は元気です!']
df['age_segment'] = pd.cut(df['age'], bins, False, labels)

置換

df['phone_number'].replace('-', '', inplace=True)

# 辞書から取得も可能
df['pref'].replace(dict, inplace=True)

文字を正規化

import jaconv


def normalize(s):
    s = str(s)
    s = jaconv.hira2kata(s)
    s = jaconv.z2h(s)
    s = s.lower()
    return s

df['norm_user_name'] = df['user_name'].apply(normalize)

特定の値を変更する

# 例: 年齢が若くて名前に魚がつく人のカテゴリを変更
df['category'] = None
df.loc[(df['age_segment'] == '10代') &
       (df['user_name'].str.contains('魚')), 'category'] = 'ギョギョギョ'

DataFrameを1行ずつ読み込む

# tupleが速い
for row in df.itertuples():
   pass # 処理

# 遅い
for row in df.iterrows():
   pass # 処理

データを他のフォーマット(形式)にする

df['user_name'].tolist() # リストの場合、カラム名は必ず指定すること
df.to_dict()             # 辞書

# ファイルに吐き出す. indexはオプション
df.to_json('filename.csv', index=False)  # json
df.to_csv('filename.csv')                # csv
df.to_excel('filename.xlsx')             # エクセル
df.to_html()                             # html