【Python】pandas基礎vol.1 ~基本操作~
pythonのpandasについて複数回に分けてまとめていきます。
| 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の場合は~
を利用します