1
2

More than 1 year has passed since last update.

はじめてのPandas:Pythonでデータ分析を始めよう

Last updated at Posted at 2023-03-04

概要

Pandasは、Pythonでデータ解析を行うためのライブラリです。Pandasを使うことで、CSVやExcelなどのファイルからデータを読み込んで、表形式で扱うことができます。また、データの前処理やクレンジング、集計、統計的な分析を行うこともできます。PandasはNumPyとMatplotlibに基づいており、これらと組み合わせることで高度なデータ分析が可能になります。

利用例

pandasでデータを前処理する一例としては、以下のような作業が挙げられます。

CSVファイルの読み込み

import pandas as pd

df = pd.read_csv('data.csv')

データの確認

# 最初の5行の表示
df.head()

# サマリー統計量の表示
df.describe()

# 行数・列数の表示
df.shape

欠損値の処理

# 欠損値の存在確認
df.isnull().sum()

# 削除
df.dropna(inplace=True)

# 0で埋める (数値の場合)
df.fillna(0, inplace=True)

# 平均値で埋める (数値の場合)
df.fillna(df.mean(), inplace=True)

# 一つ前の値で埋める (時系列データの場合)
df.fillna(method='ffill', inplace=True)

不要な列の削除

df = df.drop(['column_name_1','column_name_2'], axis=1)

列のデータ型変更

df['column_name'] = df['column_name'].astype('int')

データの結合

df_merged = pd.merge(df1, df2, on='key')

ダミー変数の作成

df_dummy = pd.get_dummies(df, columns=['column_name'])

データのソート

df_sorted = df.sort_values(by=['column_name_1', 'column_name_2'], ascending=False)

日付型の変換

df['date'] = pd.to_datetime(df['date'])

以上は代表的な前処理の例ですが、これ以外にも多くの前処理方法があります。

Numpy to Pandas

NumPyのデータをPandasに変換する方法は、pandas.DataFrame()関数を使用して、NumPyのndarrayをデータフレームに変換することができます。以下は、一つのNumPy配列をpandasの1列に変換する例です。

import numpy as np
import pandas as pd

# NumPy ndarrayを作成する
arr = np.array([['Alice', 25], ['Bob', 30], ['Charlie', 35]])

# Pandas DataFrameに変換する
df = pd.DataFrame(arr, columns=['Name', 'Age'])

# 結果を表示する
print(df)

出力結果:

       Name Age
0     Alice  25
1       Bob  30
2  Charlie   35

Pandasのデータをグラフで表示

pandasのDataFrameをグラフで表示するためには、matplotlibというPythonのグラフ描画ライブラリーを使って次の手順を実行します。

まず、グラフを描画するためのデータを準備する必要があります。pandasのDataFrameに保存されているデータを使用している場合は、次のようにして値を配列に変換できます。

import pandas as pd
import matplotlib.pyplot as plt

# example dataframe
data = {'year': [2010, 2011, 2012, 2013, 2014, 2015, 2016],
        'profit': [500, 600, 700, 800, 900, 1000, 1100]}
df = pd.DataFrame(data)
x = df['year'].values
y = df['profit'].values
plt.plot(x, y)
plt.show()

これにより、指定した列間の折れ線グラフが表示されます。他の種類のグラフも、適切なMatplotlib関数を選択することで、同じ方法で作成することができます。

ダウンロード.png

高度な使い方

リサンプリング

pandasでは時系列データを扱う機能が豊富ですが、その中でも詳しく説明していくのは、resampling(リサンプリング)と呼ばれる機能です。resamplingとは、頻度の異なる時系列データを、一定間隔で再構成することです。例えば、1分単位であるセンサーデータを5分、10分、1時間単位に変換したりします。
以下は新しい列を作成し、毎週の最大値、最小値、平均値を取得する方法の例です。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(1000, 4), index=pd.date_range('1/1/2022', periods=1000), columns=['A', 'B', 'C', 'D'])
                                                        
df_weekly_max = df.resample('W').max()
df_weekly_min = df.resample('W').min()
df_weekly_mean = df.resample('W').mean()

マージや結合

pandasを使うと複数のDataFrameをマージしたり、結合したりすることができます。ExcelでいうところのVLOOKUPや、SQLのJOINに相当する機能です。pandasのために、3つのテーブルを準備しましょう。

customersテーブル:顧客ごとに識別する情報が格納されています
ordersテーブル:注文ごとの情報が格納されています
itemsテーブル:商品ごとの情報が格納されています
customersとordersを「customer_id」(共通カラム)でマージし、さらにitemsも「order_id」でjoinする場合の例です。

import pandas as pd 
orders = pd.read_csv('orders.csv') 
customers = pd.read_csv('customers.csv')
items = pd.read_csv('items.csv')

# 注文情報と顧客情報をマージする
customer_orders = pd.merge(customers, orders, on='customer_id')

# itemsをjoinする
customer_order_items = pd.merge(customer_orders, items, on='order_id')

groupby

pandasではgroupby()関数を使うことで、指定した列や条件で集計処理を行うことができます。単にレコードの集計だけでなく、クロス集計も可能です。
以下は、天気予報のデータから日ごとに最高気温・最低気温を算出する例です。

data = {
    "date": ["2022-01-01", "2022-01-02", "2022-01-03", "2022-01-04", "2022-01-05"],
    "weather": ['cloudy', 'rainy', 'sunny', 'cloudy', 'sunny'],
    "maxtemp": [10, 9, 8, 11, 12],
    "mintemp": [-4, -1, 2, 0, -2]}

df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])  
df.set_index('date', inplace=True) 

df_daily = df.groupby(pd.Grouper(freq='D')).agg({'maxtemp': 'max', 'mintemp': 'min'}) 

これらの機能を使って、効率的かつ柔軟にデータの前処理を行うことができます。

公式サイト

1
2
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
1
2