pandasの使い方
環境
- Windows10
- anaconda
- python3
- jupyter notebook
モジュールインポート
import pandas as pd
csvやtxt、excelファイルの読み書き
csvやtxtファイルの読み込み
read_csv, read_table
# CSVの一番省略系
df = pd.read_csv('ファイルPATH')
# CSV エンコーディング指定
df = pd.read_csv('ファイルPATH', encoding='utf_8_sig')
# TXT いろいろ引数
df = pd.read_table('ファイルPATH', sep=',', encoding='utf_8_sig')
# ヘッダーが無い場合
df = pd.read_csv('ファイルPATH', encoding='utf_8_sig', header=None, names=['user_id', 'name'])
※namesは省略出来る。省略すると1,2とかになる
excelファイルの読み込み
read_excel
# EXCELの一番省略系
df = pd.read_excel('ファイルPATH')
# EXCEL 読み込むシート名の指定
df = pd.read_excel('ファイルPATH', sheet_name='シート名')
csvやexcelでの書き出し
to_csv, to_excel
# EXCELで書き出し
df.to_excel('保存ファイル名.xlsx')
# CSVで書き出し
df.to_csv('保存ファイル名.csv')
# 出力データにインデックスを含めない場合は、index=Falseを指定
df.to_excel('保存ファイル名.xlsx', index=False)
df.to_csv('保存ファイル名.csv', index=False)
# CSVのエンコーディングを指定する場合(デフォルトはUTF-8)
df.to_csv('保存ファイル名.csv', encoding='utf_8')
df.to_csv('保存ファイル名.csv', encoding='shift-jis')
df.to_csv('保存ファイル名.csv', encoding='cp932')
df(データフレーム)の確認
サンプル表示
head, tail
# 最初の5行
df.head()
# 最初から◯行(◯に行数指定)
df.head(◯)
# 末尾の5行
df.tail()
# 末尾の◯行(◯に行数指定)
df.tail(◯)
サンプル表示の設定
set_option
# 列数の表示設定
pd.set_option('display.max_columns', 300)
# 行数の表示設定
pd.set_option('display.max_rows', 300)
※数が多い時に省略されないように表示出来る
dfの情報確認
info, describe, columns, index, len, shape, dtypes
# データの要約
df.info()
# データの基本統計量
df.describe()
# 列項目の一覧
df.columns
# 行項目の一覧
df.index
# 行数取得する
len(df)
# 行・列数を取得
df.shape
# 型の取得
df.dtypes
dfの統計量の確認
describe
# 統計量の確認(全体)
df.describe()
# 統計量の確認(指定のカラムのみ)
df['カラム名'].describe() #seriesに対して実行する
それぞれの項目だけ出したいとき
max, min, count
# 最大値
df.max()
#最大値(指定のカラムのみ)
df['カラム名'].max() #seriesに対して実行する
# 最小値
df.min()
#最小値(指定のカラムのみ)
df['カラム名'].min() #seriesに対して実行する
# 個数
df.count()
# 個数(指定のカラムのみ)
df['カラム名'].count() #seriesに対して実行する
df(データフレーム)の処理
欠損値(NA)の処理
isna, isnull, dropna, fillna
# 欠損値の数を数える
df.isna().sum()
df.isnull().sum()
# 欠損値のある行を取り除く(how='all'は省略可)
df = df.dropna(how='all') #新しいdfが出来るので入れ替える
# 欠損値のある列を取り除く(how='all'は省略可)
df = df.dropna(how='all', axis=1) #新しいdfが出来るので入れ替える
# 全て欠損値の行を取り除く
df = df.dropna(how='all') #新しいdfが出来るので入れ替える
# 全て欠損値の列を取り除く
df = df.dropna(how='all', axis=1)
# 全て欠損値の行・列を取り除く
df = df.dropna(how='all').dropna(how='all', axis=1)
# 列を指定して欠損値の行を取り除く(name列を指定)
df = df.dropna(subset=['name'])
# 指定した列のいずれかが欠損値の行を取り除く(name列とagete列を指定)
df = df.dropna(subset=['name', 'age'])
# 指定した列全てが欠損値の行を取り除く(name列とagete列を指定)
df = df.dropna(subset=['name', 'age'], how='all')
# 欠損値を穴埋めする
df = df.fillna({"列名1":置換え値, "列名2":置換え値, "列名3":置換え値,.....})
必要なデータの抽出
loc
# id列の999番のデータにする
df_new = df_old.loc[df_old['id'] == '999']
# id列が1か2のデータにする「|」はあるいは
df_new = df_old.loc[(df_old['id']==1) | (order_data['id']=2)]
# インデックスがTaroでカラムがageの要素
df.loc['Taro','age']
# インデックスがTaroからHanakoでカラムがageの要素
df.loc['Taro':'Hanako','age']
# インデックスがTaroでカラムがageからaddressの要素
df.loc['Taro','age':'address']
# id列全部
df_new = df_old.loc[:, ['id']]
不要なデータの除外
# id列の999番以外のデータにする
df_new = df_old.loc[df_old['id'] != '999']
「!=」で、999に合致しないデータを抽出している
必要な列だけ選ぶ
# カラム名1・カラム名2・カラム名3・カラム名4のデータだけにする
df_new = df_old[['カラム名1', 'カラム2', 'カラム3', 'カラム名4']]
文字列の置き換え
replace
# 指定の文字を除去する
df['カラム名'] = df['カラム名'].str.replace("取り除きたい文字列", "")
df同士の結合(縦)
concat
# 縦に結合
df_all = pd.concat([df1, df2], ignore_index=True)
「ignore_index=True」は、dfごとに持っていたインデックス番号を0から振り直すこと(元のインデックスを保持する場合はFalse)
df同士の結合(横)
merge
# 横に結合
df_new = pd.merge(df1, df2, on='id', how='left')
## 内部結合(inner_join): how='inner'
## 左結合(left_join): how='left'
## 右結合(right_join): how='right'
## 外部結合(outer_join): how='outer'
# 複数の列名(key)を使う場合はリストにする
df_new = pd.merge(df1, df2, on=['id', 'day'], how='left')
# カラム名が違う場合は、それぞれで指定する
df_new = pd.merge(df1, df2, left_on='id1', right_on='id2', how='left')
# 引数で indicator=True を指定すると、どんな結果になったのかの列を追加してくれる
# _merge という列に、both,left_only,right_onlyみたいに出る
df_new = pd.merge(df1, df2, left_on='id1', right_on='id2', how='left', indicator=True)
新しい列を作って、他の列の値により新しい列の値を入れる
# 参照カラム名が0の場合と1の場合で、新しいカラム名の入力値を変更する
df.loc[df['参照カラム名'] == 0, '新しいカラム名'] = '0だったよ'
df.loc[df['参照カラム名'] == 1, '新しいカラム名'] = '1だったよ'
既に「新しいカラム名」がある場合はそのカラムの値が変更されます。「新しいカラム名」がない場合は、新しくカラムが作られます。
行名・列名の変更
rename
df_new = df.rename(columns={'A': 'Col_1'}, index={'ONE': 'Row_1'})
型の変換
astype
# id列とcd列をstr型に変換する
df[['id', 'cd']] = df[['id', 'cd']].astype(str)
日付型の変換
to_datetime
# 日付型に変換
df['date'] = pd.to_datetime(df['date'])
# 表示形式の変換
df['date'] = pd.to_datetime(df["date"]).dt.strftime("%Y/%m/%d")
# 「20200405」みたいに数字だけの形式の日付の変換
df['年月日'] = pd.to_datetime(df["20200405の入ってる列名"], format='%Y%m%d')
グループごとに集計する
groupby
# 月ごとに集計する('month'は年月列)
df_month_data = df.groupby('month')
ピボットテーブル
pivot_table
# dfを月ごと、エリアごとに集計。値はamount、集計方法は平均
piv_data = pd.pivot_table(df, index='month', columns='area', values='amount', aggfunc='mean')
pd.pivot_table(データフレーム, index=行, columns=列, values=値, aggfunc=’集計方法’)
指定の列をリストに変換
tolist
list = df['指定のカラム'].tolist()
重複の無いデータを抽出
unique
list = df['抽出カラム'].unique()
コメント