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

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

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

### CSVファイルの読み込み
```python
import pandas as pd

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

### データの確認

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

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

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

### 欠損値の処理
```python
# 欠損値の存在確認
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)
```

### 不要な列の削除
```python
df = df.drop(['column_name_1','column_name_2'], axis=1)
```

### 列のデータ型変更
```python
df['column_name'] = df['column_name'].astype('int')
```

### データの結合
```python
df_merged = pd.merge(df1, df2, on='key')
```

### ダミー変数の作成
```python
df_dummy = pd.get_dummies(df, columns=['column_name'])
```

### データのソート
```python
df_sorted = df.sort_values(by=['column_name_1', 'column_name_2'], ascending=False)
```

### 日付型の変換
```python
df['date'] = pd.to_datetime(df['date'])
```

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

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

```python
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に保存されているデータを使用している場合は、次のようにして値を配列に変換できます。

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/b1261fb1-8a7e-c288-2454-cd5dc443983b.png)


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

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

```python
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'}) 
```

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


# 公式サイト

https://pandas.pydata.org/