【Python】pandasの使い方

スポンサーリンク

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()

コメント

タイトルとURLをコピーしました