Diagonal M

データサイエンス系長期インターンで学んだことなど

【Python】pandas基礎vol.1 ~基本操作~

pythonpandasについて複数回に分けてまとめていきます。

| pandas

データの読み込み、集計、加工、絞り込みなどができ、データ分析のための前処理で役立つ。

主にSeries(1次元:リストのような形式)とDataFrame (2次元:表のような形式)というデータ構造を利用する。

| pandasの主な機能

  • 欠損値の取り扱い
  • ラベル位置を自動的・明示的に揃えたデータの作成
  • データ集約
  • SQLのような問い合わせ、データ加工、データフレーム結合
  • ファイルやデータベースからのデータの取り込みDataFrameに変換
  • 時系列データ固有の処理

| データフレームの作成

Name Age Sex
佐々木 13
杉田 65
後藤 22

<上表のデータフレームを作成する>

import pandas as pd

df = pd.DataFrame([['佐々木', 13, '女'], ['杉田', 65, '男'], ['後藤', 22, '男']],
                  columns=['Name', 'Age', 'Sex', ])
df
Name Age Sex
0 佐々木 13
1 杉田 65
2 後藤 22

データフレームは、列名をキー、列の内容が値の辞書のようなかたちでつくることができる。

出力されたDataFrameオブジェクトの左端には、行番号のようなものが見えます。この「列ではない数値の並び」が、DataFrameオブジェクトの「インデックスラベル」です。インデックスラベルは「列の名前」のようなものであるが、列ではなく行に付きます。pandasは、デフォルトでインデックスラベルに行番号を生成します(0からの連番)。

| 特定の列を取り出す

<名前(Name)列のデータを取り出す>

names = df['Name']
print(names)


# 0    佐々木
# 1     杉田
# 2     後藤
# Name: Name, dtype: object

| 列の最小値、平均値を取り出す

抽出した列の値の最小値、平均値を取得する。

ages = df['Age']

min_age = ages.min()
mean_age = ages.mean()

print(min_age)
print(mean_age)


# 13
# 33.333333333336

その外にも以下のようなものがある。

コード
最小値 min()
最大値 max()
合計値 sum()
平均値 mean()

| pandasによるデータの読み込み

pandas.read_ファイル形式()のようにread_のあとに、ファイル形式にしたがった名前を指定することで、ファイルを読み込みDataFrameに変換できる

対応しているファイル形式の一部を下にまとめます。

ファイル形式 read_< >
Excel read_excel
テキストファイル read_table
HTMLのtableタグ read_html
JSON read_json
リレーショナルデータベース read_sql
Google BigQuery read_gbq

| CSVファイルを取り込む

<diagonal.csvをデータフレームとして読み込む>

df = pd.read_csv('diagonal.csv', encoding='utf-8')
df.head()  # 先頭の5行のみ
city name age sex height weight saving
0 Yokohama Sato 23 man 1.75 60 20
1 Setagaya Sasaki 54 man 1.78 54 800
2 Shibuya Suzuki 17 woman 1.59 84 8
3 Shibuya Goto 22 man 1.74 95 16
4 Yokohama Shimazaki 43 woman 1.55 48 300

| 出現回数を取得する 

<市ごとの人数を集計する>

city_counts = df['city'].value_counts()
city_counts


# Yokohama    4
# Shibuya     3
# Setagaya    3
# Name: city, dtype: int64

| グループごとに集計する

DataFrame.groupby()を利用すると、グループごとの合計値、平均などを集計できる。

市ごとの平均貯金額を計算するには

  • df.groupby(by=列ラベル)で列ラベルで指定した列の値によってグループ化する
  • 合計値sum()や平均値mean()の計算したいものを追記する

<市ごとの平均貯金額を取得する>

grouped_df = df.groupby(by='city').mean()
mean_saving = grouped_df['saving']
mean_saving


# city
# Setagaya    1700.000000
# Shibuya      334.666667
# Yokohama      94.500000
# Name: saving, dtype: float64

| 列の追加

<体重と身長からBMIを計算し列を追加する>

df['bmi'] = df['weight'] / df['height'] ** 2
df.head()
city name age sex height weight saving bmi
0 Yokohama Sato 23 man 1.75 60 20 19.6
1 Setagaya Sasaki 54 man 1.78 54 800 17.0
2 Shibuya Suzuki 17 woman 1.59 84 8 33.2
3 Shibuya Goto 22 man 1.74 95 16 31.4
4 Yokohama Shimazaki 43 woman 1.55 48 300 20.0

| 条件での絞り込み

データフレーム[条件式]と書くことでデータを絞り込むことができます。

<貯金額が1000万円以上の人を表示する>

df_filtering = df[df['saving'] >= 1000]
df_filtering
city name age sex height weight saving bmi
8 Setagaya ota 54 woman 1.49 46 2500 20.7
9 Setagaya kimura 30 man 1.68 60 1800 21.3

| 論理演算での絞り込み

<貯金額が30万円以上か、10万円未満の人を表示する>

df_filtering = df[(df['saving'] >= 1000) | (df['saving'] < 10)]
df_filtering
city name age sex height weight saving bmi
2 Shibuya Suzuki 17 woman 1.59 84 8 33.2
8 Setagaya ota 54 woman 1.49 46 2500 20.7
9 Setagaya kimura 30 man 1.68 60 1800 21.3

論理演算はPythonと違い、andの場合は&、orの場合は|、notの場合は~を利用します