#目次
1.はじめに
2.pandasとは
3.pandasのインポート
4.pandasのデータ構造
5.データの読み込みと加工
6.おわりに
#1. はじめに
最近GCIやE資格取得に向けたプログラムを受けている真っ最中の初学者です。
この記事ではpandasの機能についてまとめていきます。
#2. pandasとは
- pandasとは、プログラミング言語pythonにおいてデータ解析を支援する機能を提供しているオープンソースのライブラリです。データサイエンスの分野では、機械学習前の前処理(データの加工・整形)などで多く使用されます。
- できること
- csv,xlsxなどのデータの読み込み
- 加工, データの抽出
- 欠損値の補完
- etc...
#3. pandasのインポート
ライブラリをインポートするための構文として以下の3種類があります。
- import
ライブラリ名(モジュール名)
- import
ライブラリ名(モジュール名)
as略称
- from
ライブラリ名(モジュール名)
import機能名
1番目,2番目はライブラリ全体をインポートしたい時、3番目は一部の機能のみインポートしたい時に用いられます。
特に2番目の構文を用いることで、ライブラリの機能を呼び出す際にコードを簡略化することができます。
今回は2番目の構文を用います。
import pandas as pd
pandas
をpd
という略称で読み込んでいます。pd
と略すのは慣例なので特に意味はありません。
#4. pandasのデータ構造
pandasのデータ構造には主にSeriesとDataFrameの2種類があります。
(https://pandas.pydata.org/pandas-docs/stable/user_guide/dsintro.html)
Series
は1次元、DataFrame
は2次元のデータを扱う際に用いられます。
- Seriesの例
series = pd.Series([2,0,2,1,1,2,0,2])
series
0 2
1 0
2 2
3 1
4 1
5 2
6 0
7 2
dtype: int64
Seriesでは左列にindex、右列に要素が入ります。
indexは指定することも可能です。
series = pd.Series([2,0,2,1,1,2,0,2] ,
index = ['A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H'])
series
A 2
B 0
C 2
D 1
E 1
F 2
G 0
H 2
dtype: int64
- DataFrameの例
data = {'student ID':[19001,19002,19003,19004] ,
'nativeplace':['Tokyo' , 'Kyoto' , 'Fukuoka' , 'Hokkaido'] ,
'age':[20 , 22 , 43, 19] ,
'name':['Kota' , 'Yuki' , 'Tomoshi','Kaito']}
dataframe = pd.DataFrame(data)
dataframe
出力結果
student ID | nativeplace | age | name | |
---|---|---|---|---|
0 | 19001 | Tokyo | 20 | Kota |
1 | 19002 | Kyoto | 22 | Yuki |
2 | 19003 | Fukuoka | 43 | Tomoshi |
3 | 19004 | Hokkaido | 19 | Kaito |
左から1列目にindexが入ります。
1行目をcolumn
と呼びます。
#5. データの読み込みと加工
####5.1 ファイルの読み込み
- csvデータの読み込み
pd.read_csv
を用いることで読み込むことができます。
以下ではカルフォルニア大学のオープンデータセットを使用しています。
CSVはComma(,) Separated Values
の略称ですが、セミコロン( ; )で区切られているデータも存在します。その場合は引数にsep = ';'
を追加する必要があります。
winequality_data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv' , sep = ';')
winequality_data.head()
DataFrame.head()
とすることで5行目までのデータを表示することが可能です。
任意の行数表示させたい場合はDataFrame.head(10)
のように指定することで表示できます。
- Excelデータの読み込み
pd.ExcelFile
を用いることで読み込み可能です。
以下ではcsv同様カルフォルニア大学のオープンデータセットを使用しています。
onlineretail_data = pd.ExcelFile('http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx')
onlineretaildata_table = onlineretail_data.parse('Online Retail')
onlineretaildata_table.head()
####5.2 データの状態の確認
- データの行数,列数の確認
DataFrame.shape
とすることで取得できます。
winequality_data.shape
(1599, 12)
-
データの性質の確認 :
DataFrame.info()
とすることで変数の型,欠損値の有無などが確認できます。
winequality_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1599 entries, 0 to 1598
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 fixed acidity 1599 non-null float64
1 volatile acidity 1599 non-null float64
2 citric acid 1599 non-null float64
3 residual sugar 1599 non-null float64
4 chlorides 1599 non-null float64
5 free sulfur dioxide 1599 non-null float64
6 total sulfur dioxide 1599 non-null float64
7 density 1599 non-null float64
8 pH 1599 non-null float64
9 sulphates 1599 non-null float64
10 alcohol 1599 non-null float64
11 quality 1599 non-null int64
dtypes: float64(11), int64(1)
memory usage: 150.0 KB
- 量的データの基本統計量
DataFrame.describe()
とすることで量的データの基本統計量を出力できます。量的データとは数字の大小に意味があるデータです。(ex. 身長,体重,値段...)
winequality_data.describe()
- 欠損値の確認
DataFrame.isnull().sum()
とすることで各列の欠損値(nan)の数を出力できます。
winequality_data.isnull().sum()
fixed acidity 0
volatile acidity 0
citric acid 0
residual sugar 0
chlorides 0
free sulfur dioxide 0
total sulfur dioxide 0
density 0
pH 0
sulphates 0
alcohol 0
quality 0
dtype: int64
####5.3 データの加工
- 転置
DataFrame.T
とすることで行と列を入れ替えることができます。
dataframe
出力結果
| | student ID | nativeplace | age | name |
|:---: | :---: | :---: | :---: | :---: |
|0| 19001 | Tokyo | 20 | Kota |
|1| 19002 | Kyoto | 22 | Yuki |
|2| 19003 | Fukuoka | 43 | Tomoshi |
|3| 19004 | Hokkaido | 19 | Kaito |
dataframe.T
出力結果
| | 0 | 1 | 2| 3 |
|:---: | :---: | :---: | :---: | :---: |
|student ID| 19001 | 19002 | 19003 | 19004 |
| nativeplace| Tokyo | Kyoto | Fukuoka | Hokkaido |
| age| 20 | 22 | 43 | 19 |
|name| Kota | Yuki | Tomoshi | Kaito |
- 特定列の抜き出し
DataFrame['抜き出したい列名(column)
']
もしくは
DataFrame.抜き出したい列名(column)
とすることで抜き出すことができます。
1列の抜き出し
dataframe['student ID']
0 19001
1 19002
2 19003
3 19004
Name: student ID, dtype: object
複数列の抜き出し
dataframe[['student ID','age']]
出力結果
| | student ID | age |
|:---: | :---: | :---: |
|0| 19001 | 20 |
|1| 19002 | 22 |
|2| 19003 | 43 |
|3| 19004 | 19 |
複数列を抜き出す場合は括弧を2重にする必要があります。
DataFrame.抜き出したい列名(column)
の場合も使い方は基本同じですが、columnにスペースが含まれている場合やcolumnの先頭が数字の場合などは使えないので注意してください。
dataframe.student ID
File "<ipython-input-48-e3d441d2246b>", line 1
dataframe.student ID
^
SyntaxError: invalid character in identifier
dataframe.age
0 20
1 22
2 43
3 19
Name: age, dtype: object
- 特定行の抜き出し
DataFrame[i:j]
( i ≦ 抜き出したい行のindex < j )とすることで任意の行を抜き出せます。
例えばindexが1の行を抜き出したい場合はDataFrame[1:2] となります。
dataframe[1:2]
出力結果
| | student ID | nativeplace | age | name |
|:---: | :---: | :---: | :---: | :---: |
|1| 19002 | Kyoto | 22 | Yuki |
i,jの値を変更することで複数行の抜き出しも可能です。
また、indexが文字の場合はDataFrame['index_a':'index_b']
とすることで抜き出し可能です。この場合index_b
の行まで抜き出されます。
dataframe_eng = pd.DataFrame(data,index=['A','B','C','D'])
dataframe_eng
出力結果.
| | student ID | nativeplace | age | name |
|:---: | :---: | :---: | :---: | :---: |
|A| 19001 | Tokyo | 20 | Kota |
|B| 19002 | Kyoto | 22 | Yuki |
|C| 19003 | Fukuoka | 43 | Tomoshi |
|D| 19004 | Hokkaido | 19 | Kaito |
dataframe_eng['B':'C']
出力結果.
| | student ID | nativeplace | age | name |
|:---: | :---: | :---: | :---: | :---: |
|B| 19002 | Kyoto | 22 | Yuki |
|C| 19003 | Fukuoka | 43 | Tomoshi |
- 特定の行&特定の列の抜き出し
任意の行,任意の列を抜き出す機能としてDataFrame.loc
, DataFrame.iloc
があります。
iloc
はloc
のindex活用版になります。
いずれもDataFrame.(i)loc[抜き出したい行範囲 , 抜き出したい列範囲]
とすることで抜き出しができます。
DataFrame.iloc
の場合は範囲指定にindexのみが使用できます。
dataframe.loc[1:3, ['nativeplace' , 'age']]
出力結果.
| | nativeplace | age |
|:---: | :---: | :---: | :---: | :---: |
|1| Kyoto | 22 |
|2| Fukuoka | 43 |
|3| Hokkaido | 19 |
dataframe.iloc[1:4,1:3]
出力結果.
| | nativeplace | age |
|:---: | :---: | :---: | :---: | :---: |
|1| Kyoto | 22 |
|2| Fukuoka | 43 |
|3| Hokkaido | 19 |
ilocで範囲指定する場合、範囲の右側は含まれないので注意が必要です。
dataframe.iloc[:,1:3]
出力結果
| | nativeplace | age |
|:---: | :---: | :---: | :---: |
|0 | Tokyo | 20 |
|1 | Kyoto | 22 |
|2 | Fukuoka | 43 |
|3 | Hokkaido | 19 |
範囲指定の際に:
とすることで全範囲(今回は全ての行)を指定できます。
- 条件を満たすデータの抽出
DataFrame[条件式]
とすることで条件を満たすデータのみを抽出できます。
dataframe[ dataframe['age'] > 20 ]
出力結果
| | student ID | nativeplace | age | name |
|:---: | :---: | :---: | :---: | :---: |
|1| 19002 | Kyoto | 22 | Yuki |
|2| 19003 | Fukuoka | 43 | Tomoshi |
and( & ) , or( | )を用いて抽出することもできます。
dataframe[ (dataframe['age'] >= 20) | (dataframe['nativeplace'] =='Fukuoka') ]
出力結果
| | student ID | nativeplace | age | name |
|:---: | :---: | :---: | :---: | :---: |
|0| 19001 | Tokyo | 20 | Kota |
|1| 19002 | Kyoto | 22 | Yuki |
|2| 19003 | Fukuoka | 43 | Tomoshi |
#6. おわりに
拙い文章ですが最後まで読んでいただきありがとうございました。
何かの役に立てば幸いです。