データの集計や加工で使うリスト
ふとした時に更新していく予定
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