LoginSignup
7
9

More than 5 years have passed since last update.

[python3] 非IT業務でも使える pandas の基本的な使い方

Last updated at Posted at 2019-02-09

はじめに

高度な機械学習用のデータ分析などに利用されているpandasですが、直感的で簡単にデータを操作できるため、高度な利用だけでなく、日々の業務にも利用できるんじゃ無いかと思い、備忘録として基本的操作をまとめます。
勉強中ですのでどんどん更新していきます。

エクセルやcsvファイルに入っているデータを読み出して、計算したり、ちょっとしたグラフ作成したりできます。表計算(エクセル)はどんな仕事でも使うと思うので、簡単な使い方を理解するだけですぐ利用できます。

また、時系列データの操作にも強いので、株価データの取り扱いなど様々なことに応用できるかと思います。

データ操作の学習には、jupyter notebookを利用することをお勧めします。

インストール

$ pip3 install pandas

インポート

pd としてインポートするのが慣例。

import pandas as pd

DataFrameの作成

① 値のリストを渡して、カラム名もリストで指定

create_df1.py
import pandas as pd


df = pd.DataFrame([[1, 2, 3], [2, 4, 6], [3, 6, 9]],
                  columns=['column1','column2','columns'])
# インデックス名(行名)を指定したい際は、同様に、index=['index1','index2', 'index3']を追加する。

print(df)

② カラム名をキーとした辞書を渡すことも可能。

create_df2.py
import pandas as pd

df = pd.DataFrame({
        'column1': [1, 2, 3],
        'column2': [2, 4, 6],
        'column3': [3, 6, 9],
     })

print(df)

どちらも結果は以下のようになる。

結果
   column1  column2  column3
0        1        2        3
1        2        4        6
2        3        6        9

CSVデータとして保存

df.to_csv('test.csv')

CSVを読み込んで、列名/行名を取得

pandasはデフォルトで自動的にcsvファイルの1行目をカラム名として読んでくれる。(便利)
インデックスは、0,1,2,..と自動で付与される。

import pandas as pd

# 読み込みは、read_csvをつかう。
df = pd.read_csv('test.csv')

# インデックスオブジェクトを返す。
print(df.columns)

# リストを返す
print(df.columns.values)

行名が欲しい場合は、"columns"を"index"にする。

結果
# インデックスオブジェクト
Index(['column1', 'column2', 'column3'], dtype='object')

# リスト
['column1', 'column2', 'column3']

※ Headerがない(列名が無いファイル)を読み込む際は、引数header=Noneを追加すると列名にも自動で、0,1,2,..と付与される。

pd.read_csv('test.csv', header=None)

CSV以外の各種データの読み込み

read_data
# Excelファイル
# デフォルトでは1番目のシートを読み出すが、指定可能。
pd.read_excel('test.xlsx')
pd.read_excel('test.xlsx', sheetname='Sheet3')

# sql
pd.read_sql('SELECT * FROM test', conn)

# json
pd.read_json('test.json')

# tsv(2通り。どちらでも可能)
pd.read_table('test.tsv')
pd.read_csv('test.tsv', sep='\t')

データフレームの操作

上からor下から指定行数分取り出す

行数を指定しなければ、デフォルトで5行分表示される。

# 上から2行分
df.head(2)
# 下から2行分
df.tail(2)

データフレームの行数、列数を確認する

タプル型で行数、列数が返ってくる。

df.shape
# => (3, 3)

行と列の入れ替え

df.T

特定の行の値を取り出す

色々やり方ありますが、下記は、df[カラム名]で取り出す方法。

df['column1']
結果
   column1
0        1
1        2
2        3

特定の範囲の値を取り出す

.locを使う。
indexの"0"と"2"の、columns"1~2"を取り出す。

df.loc[[0, 2],0:2] 
結果
   column1 column2
0        1       2
2        3       6 

列名を変更する

df = df.rename(columns={'column1':'col1', 'column2':'col2'})
結果
      col1     col2  column3
0        1        2        3
1        2        4        6
2        3        6        9

行を削除する

# index=1の行を削除
df = df.drop('1', axis=0) # axis=0は書かなくてもOK

列を削除する

# 'column3'の列を削除
df = df.drop('column3', axis=1)

各列の型を調べる

df.dtypes

特定の列をインデックスにする

df.set_index['column2']

統計的メソッド

各行の平均
df.mean()
結果
column1    2.0
column2    4.0
column3    6.0
データフレーム全ての値の平均
df.mean().mean()
結果
4.0

他各種統計的メソッド

# 合計
df['column2'].sum()
# 中央値
df['column2'].median()
# 最小値
df['column2'].min()
# 最大値
df['column2'].max()
# 標準偏差
df['column2'].std()
# 分散
df['column2'].var()
# 欠損値を除いたデータ数
df['column2'].count()
# 最頻出するデータの値
df['column2'].top()
# 最頻出するデータ数
df['column2'].freq()

データをソートする

列名を指定して、降順/昇順をFalse/Trueで指定


df.sort_values('column3', ascending=False)

groupbyメソッド

下記のようなデータフレームがあるとする。(各年各月の支出)
groupbyメソッドを利用することで、各年毎や各月毎の合計支出や平均支出といった統計が取れる。

df_pay

食費 娯楽 家賃
0 2014 1 30000 35000 80000
1 2014 2 32000 28000 80000
... ... ... ... ... ...
46 2018 11 32000 42000 100000
47 2018 12 35000 40000 100000
# 各年毎の各種支出の合計
# 各月毎なら'年'を'月'に
df_pay.groupby('年').sum()
       月      食費      娯楽      家賃
年
2014   78   372000    342000    960000
2015   78   342000    332000    960000
2016   78   352000    384000    960000
2017   78   412000    372000   1200000
2018   78   382000    400000   1200000

他の各種統計的メソッドももちろん利用可能

# 平均値
df_pay.groupby('年').mean()
# 中央値
df_pay.groupby('年').median()
# 最小値
df_pay.groupby('年').min()
# 最大値
df_pay.groupby('年').max()
# 標準偏差
df_pay.groupby('年').std()
# 分散
df_pay.groupby('年').var()
7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9