ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Python - Pandas で扱うデータ構造(Series、DataFrame)について

初めに

 初心者が Pandas を扱う前に知っておいた方がよい知識として、Pandas で扱うデータ構造があります。本記事では、Pandas を使うと出てくる Series と DataFrame という2つのデータ構造についてまとめます。

Series と DataFrame の違い

 Series と DataFrame はそれぞれ次のような特徴をもつデータ構造です。

  • Series:1次元データを格納する
  • DataFrame:2次元データを格納する

Series の基本的な使い方

 Series を操作するうえで使用できる変数や関数は次のリンク先から確認できます。

pandas.pydata.org

Series の作成
import pandas as pd

# リストからSeriesを作成
data = [1, 2, 3, 4, 5]
series = pd.Series(data)

# インデックスを指定して作成
data = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
series = pd.Series(data, index=index)
全要素の確認
import pandas as pd

# リストからSeriesを作成
data = [1, 2, 3, 4, 5]
series = pd.Series(data)

# seriesの要素を表示
print(series)
要素の選択

 次のような選択方法があります。

(インデックスから指定)

import pandas as pd

# インデックスを指定して作成
data = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
series = pd.Series(data, index=index)

# インデックスを指定して要素を取得
print(series['a'])  # 出力: 1

(インデックスを用いて範囲指定)

import pandas as pd

# インデックスを指定して作成
data = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
series = pd.Series(data, index=index)

# インデックスを使ったスライシング
print(series['b':'d'])  #b から d までの要素を表示

(条件に基づいて要素を指定)

import pandas as pd

# リストからSeriesを作成
data = [1, 6, 5, 7, 9]
series = pd.Series(data)

# 条件に基づいて要素を選択
print(series[series > 3])  # 3 より大きい 6, 5, 7, 9 が出力
要素の変更、追加、削除

 次のように、選択した要素を変更したり、追加したりできます。

# 特定の要素を変更
series['c'] = 10

# 新しい要素を追加
series['f'] = 6

 また、del を用いて要素を削除することができます。

# 特定の要素を削除
del series['e']
サイズの取得

 size を用いて、要素数を取得できます。

import pandas as pd

data = [1, 2, 3, 4, 5]
series = pd.Series(data)

# Seriesの要素数を取得し、表示する
series_size = series.size
print("Seriesの要素数:", series_size)
要素の存在確認

 in を用いて、要素が series に含まれるかどうか、判定できます。

import pandas as pd

data = [1, 2, 3, 4, 5]
series = pd.Series(data)

a = 3 in series # 3 が入っていたら true
print("Seriesに 3 がある:", a)    
ソート

 sort_values 関数を使って、昇順、降順に並べ替えることができます。

import pandas as pd

data = [4, 2, 1, 5, 3]
series = pd.Series(data)

# 昇順でソート
sorted_series_ascending = series.sort_values(ascending=True)

print("昇順ソート:")
print(sorted_series_ascending)

 ascending は昇順を意味します。そのため、True のときは昇順、False の場合は降順となります。なお、ascending を記述しない場合は、デフォルトの昇順ソートをします。

DataFrame の基本的な操作

 DataFrame を操作するうえで使用できる変数や関数は次のリンク先から確認できます。

pandas.pydata.org

DataFrame の作成

 次のように中括弧を用いて, データフレームを作成します。

import pandas as pd

# 辞書型データからDataFrameを作成
data = {'Column1': [1, 2, 3, 4],
        'Column2': ['A', 'B', 'C', 'D'],
        'Column3': [10.5, 20.2, 15.8, 30.1],
        'Column4': ['X', 'Y', 'Z', 'W'],
        'Column5': [True, False, True, False]}

df = pd.DataFrame(data)

# DataFrameを表示
print(df)

 辞書型データはコロンの左に列名を、右に列に入る要素を入力します。そのデータを DataFrame() を用いて、DataFrame を作成します。

列の選択
import pandas as pd

# 辞書型データからDataFrameを作成
data = {'Column1': [1, 2, 3, 4],
        'Column2': ['A', 'B', 'C', 'D'],
        'Column3': [10.5, 20.2, 15.8, 30.1],
        'Column4': ['X', 'Y', 'Z', 'W'],
        'Column5': [True, False, True, False]}

df = pd.DataFrame(data)

column3 = df['Column3']  # Column3列を選択
print(column3.sort_values())

 列名を指定することで、列を取得することができます。各列は Series と同じように扱えます。上では、Column3 を取得し、昇順に並び替えたものを表示させています。

行、列の追加

(列の追加)

import pandas as pd

# 辞書型データからDataFrameを作成
data = {'Column1': [1, 2, 3, 4],
        'Column2': ['A', 'B', 'C', 'D'],
        'Column3': [10.5, 20.2, 15.8, 30.1],
        'Column4': ['X', 'Y', 'Z', 'W'],
        'Column5': [True, False, True, False]}

df = pd.DataFrame(data)

df['Column6'] = [100, 200, 300, 400]    #df に "Column6"という名前の列の追加

print(df)

(行の追加)

import pandas as pd

# DataFrameの作成
data = {'Column1': [1, 2, 3, 4],
        'Column2': ['A', 'B', 'C', 'D'],
        'Column3': [10.5, 20.2, 15.8, 30.1]}
df = pd.DataFrame(data)

# 新しい行のデータ
new_data = {'Column1': 5, 'Column2': 'E', 'Column3': 25.3}

# DataFrameに新しい行を追加
df = pd.concat([df, pd.DataFrame([new_data])], ignore_index=True)

print(df)

concat() 関数を使って、縦にデータを連結できます。その機能を使うことで行を追加することができます。なお、append() 関数という行を追加する関数がありますが、バージョン1.4.0 で非推奨、バージョン2.0.0 で削除されたようです。

値を抽出する

(ラベルを使って抽出する)

# DataFrameの作成
# indexが行のラベル, columnが列のラベル
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

#loc[行のラベル, 列のラベル]
print(df.loc["cobra", :])
print(df.loc[:, "max_speed"])


# DataFrameの作成
# indexが行のラベル, columnが列のラベル
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

#iloc[行番号, 列番号]
#番号の開始は 0 から, 上限は含まない
print(df.iloc[0:2, 1:2])    #0, 1行目, 1列目
print(df.iloc[1:2, 0:2])    #1行目, 0, 1列目
行、列の変更、削除

(列の操作)

# 既存の列の値を変更
df['Column1'] = [5, 6, 7, 8]

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

(行の操作)

# 特定の行の値を変更
df.loc[2, 'Column2'] = 'F'

# 行の削除
df = df.drop(0)

行、列の変更は選択して、代入でできます。また、行、列の削除はdrop() 関数を使います。

条件に基づく行の選択
print(df[df['Column3'] > 15])  # Column3が15より大きい行を選択
csvファイルからデータフレームの読み込む、csvファイルにデータフレームを書き込み
# CSVファイルの読み込み
df = pd.read_csv('data.csv')

# DataFrameをCSVファイルに書き込み
df.to_csv('new_data.csv', index=False)

 read_csv() 関数を使って読み込み、to_csv() 関数を使って書き込むことができます。csvファイルに限らず、他のファイル形式のread, to 関数もあります。