【Python】pandas

pandasはPythonでのデータ分析ツールとして最も活用されており、データの入手や加工など多くのデータ処理に使われています。

pandasの概要

pandasはNumpyを基盤にシリーズ(Series)とデータフレーム(DataFrame)というデータ型を提供しています。
pandasを利用するには以下のようにインポートします。

import pandas as pd

Seriesとは

Seriesは一次元データで、Seriesオブジェクトを作るにはSeriesを使います。

ser = pd.Series([10,20,30,40])
ser
0    10
1    20
2    30
3    40
dtype: int64

DataFrameとは

DataFrameは二次元データで、DataFrameオブジェクトを作るにはDataFrameを使います。

df = pd.DataFrame([[10,"a",True],
                 [20,"b",False],
                 [30,"c",True],
                 [40,"d",False]])
df
	0	1	2
0	10	a	True
1	20	b	False
2	30	c	True
3	40	d	False

Numpyのarange関数を使って20×4行列のデータを生成し、DataFrameを作ります。

import numpy as np
df = pd.DataFrame(np.arange(80).reshape((20,4)))
df
	0	1	2	3
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11
3	12	13	14	15
4	16	17	18	19
5	20	21	22	23
6	24	25	26	27
7	28	29	30	31
8	32	33	34	35
9	36	37	38	39
10	40	41	42	43
11	44	45	46	47
12	48	49	50	51
13	52	53	54	55
14	56	57	58	59
15	60	61	62	63
16	64	65	66	67
17	68	69	70	71
18	72	73	74	75
19	76	77	78	79

headメソッドで先頭3行のみ取得

df.head(3)
0	1	2	3
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11

tailメソッドで末尾3行のみ取得

df.tail(3)
0	1	2	3
17	68	69	70	71
18	72	73	74	75
19	76	77	78	79

DataFrameのサイズを知るには、shapeを使います。

df.shape
(20, 4)

インデックス・カラム名

DataFrameではインデックス名(行の名前)やカラム名(列の名前)を指定できます。

df = pd.DataFrame(np.arange(6).reshape((3,2)))
df
	0	1
0	0	1
1	2	3
2	4	5
df.index = ["01","02","03"]
df.columns = ["A","B"]
df
	A	B
01	0	1
02	2	3
03	4	5

DataFrame作成時に指定することもできます。

named_df = pd.DataFrame(np.arange(6).reshape((3,2)),
                       index=["01","02","03"],
                       columns = ["A","B"])
named_df
	A	B
01	0	1
02	2	3
03	4	5

辞書(dict)形式でDataFrameを作ることもできます。
カラム名だけを指定し、インデックス名は連番で割り当てられます。

pd.DataFrame({"A":[0,2,4],"B":[1,3,5]})
	A	B
0	0	1
1	2	3
2	4	5

データの抽出

df = pd.DataFrame(np.arange(12).reshape((4,3)),
                       index=["01","02","03","04"],
                       columns = ["A","B","C"])
df
	A	B	C
01	0	1	2
02	3	4	5
03	6	7	8
04	9	10	11

カラム名を指定して抽出します。

df["B"]
01     1
02     4
03     7
04    10
Name: B, dtype: int32
df[["B","C"]]
   B	C
01	1	2
02	4	5
03	7	8
04	10	11

インデックス値を指定して抽出します。
インデックス番号の0と1を抽出

df[:2]
A	B	C
01	0	1	2
02	3	4	5

インデックス番号の2と3を抽出

df[2:]
A	B	C
03	6	7	8
04	9	10	11

locとiloc
Pandasのlocとilocは値を抽出するためのメソッドです。
locは行名もしくは列名を指定することで特定の値を抽出できます。

df.loc[:,:]
	A	B	C
01	0	1	2
02	3	4	5
03	6	7	8
04	9	10	11

カラム方向を指定して抽出

df.loc[:,"A"]
01    0
02    3
03    6
04    9
Name: A, dtype: int32
df.loc[:,["A","B"]]
	A	B
01	0	1
02	3	4
03	6	7
04	9	10

インデックス方向を指定して抽出

df.loc["01",:]
A    0
B    1
C    2
Name: 01, dtype: int32
df.loc[["01","03"],:]
	A	B	C
01	0	1	2
03	6	7	8

インデックスとカラムを両方指定

df.loc[["01","03"],["A","B"]]
A	B
01	0	1
03	6	7

ilocはindexを指定することで特定の値を抽出できます。
インデックス番号とカラム番号で抽出します。

	A	B	C
01	0	1	2
02	3	4	5
03	6	7	8
04	9	10	11
df.iloc[1,1]
4
df.iloc[1:,1]
02     4
03     7
04    10
Name: B, dtype: int32
df.iloc[1:,:2]
   A	B
02	3	4
03	6	7
04	9	10

データの読み込み・書き込み

データの読み込み(CSV)

事前に準備した来客数と売上のデータのcsvファイルを読み込みます。

df = pd.read_csv("C:/data/data.csv",encoding="utf-8")
df
	日付	売上	来客数
0	2023-01-01	69989	51
1	2023-01-02	78302	70
2	2023-01-03	53671	25
3	2023-01-04	86240	26
4	2023-01-05	74553	89
5	2023-01-06	49224	21
・・・

データの読み込み(Excel)

df = pd.read_excel("C:/data/data.xlsx")
df
日付	売上	来客数
0	2023-01-01	69989	51
1	2023-01-02	78302	70
2	2023-01-03	53671	25
3	2023-01-04	86240	26
4	2023-01-05	74553	89
5	2023-01-06	49224	21
・・・

webサイトのHTMLから表を取得

下記webサイトのHTML内にあるtable要素を抜き出します。

https://ja.wikipedia.org/wiki/トップレベルドメイン一覧

url ="https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E4%B8%80%E8%A6%A7"
tables = pd.read_html(url)
len(tables)
40

ページ内に40個のテーブルがあることが分かりました。
インデックスを指定して対象のテーブルを抽出します。

df = tables[1]
df

データの書き込み(CSV)

データの書き込みは、to_csvを使います。

df.to_csv("C:/data/data.csv")

データの書き込み(Excel)

df.to_excel("C:/data/data.xlsx")

データの再利用

pickleモジュールは、Pythonのオブジェクトを直列化し、ファイルへの書き込み及び読み込みが可能です。
to_pickleメソッドはファイルに書き出します。

df.to_pickle("C:/data/write_df.pickle")

read_pickleメソッドはpickle形式に直列化されたデータを読み込むことが可能です。

df = pd.read_pickle("C:/data/write_df.pickle")

データの整形

まずは使用するデータを読み込みます。

df = pd.read_excel("C:/data/data.xlsx")
df
     日付	売上	来客数
0	2023-01-01	69989	51
1	2023-01-02	78302	70
2	2023-01-03	53671	25
3	2023-01-04	86240	26
4	2023-01-05	74553	89
5	2023-01-06	49224	21
・・・

売上が50000以上の条件で抽出してみます。

df["売上"] >= 50000
0      True
1      True
2      True
3      True
4      True
5     False
・・・

このboolean型のSeriesをDataFrameに当てはめて、Trueの行だけ抽出できます。

df_selected = df[df["売上"] >= 50000]
df_selected
	日付	売上	来客数
0	2023-01-01	69989	51
1	2023-01-02	78302	70
2	2023-01-03	53671	25
3	2023-01-04	86240	26
4	2023-01-05	74553	89
6	2023-01-07	93566	67
7	2023-01-08	52820	64
8	2023-01-09	76983	37
13	2023-01-14	83898	69
14	2023-01-15	58561	34
18	2023-01-19	87110	84
19	2023-01-20	74743	70
20	2023-01-21	99073	40
21	2023-01-22	80673	41
22	2023-01-23	68824	21
24	2023-01-25	52180	79
25	2023-01-26	93228	74
df_selected.shape
(17, 3)

また、queryメソッドを使ってデータを抽出することができます。

df.query('売上>= 50000 and 来客数<= 60')
        日付	売上	来客数
0	2023-01-01	69989	51
2	2023-01-03	53671	25
3	2023-01-04	86240	26
8	2023-01-09	76983	37
14	2023-01-15	58561	34
20	2023-01-21	99073	40
21	2023-01-22	80673	41
22	2023-01-23	68824	21

データ型変換

まず現在のデータ型を確認します。

df.dtypes
日付     object
売上      int64
来客数     int64
dtype: object

現在、日付カラムは文字列として扱われているので、applyメソッドを使って一括でdatetime型に変換してみます。
カラム日付に対して、applyメソッドを使ってデータ変換し、dateカラムに挿入しています。

df.loc[:,'date']=df.loc[:,'日付'].apply(pd.to_datetime)
df.loc[:,'date']
0    2023-01-01
1    2023-01-02
2    2023-01-03
3    2023-01-04
4    2023-01-05
5    2023-01-06
・・・
Name: date, dtype: datetime64[ns]
df
	日付	売上	来客数	date
0	2023-01-01	69989	51	2023-01-01
1	2023-01-02	78302	70	2023-01-02
2	2023-01-03	53671	25	2023-01-03
3	2023-01-04	86240	26	2023-01-04
4	2023-01-05	74553	89	2023-01-05
5	2023-01-06	49224	21	2023-01-06

dateカラムが追加されています。
次に売上をastypeメソッドを使ってfloat型に変換してみます。

df.loc[:,"売上"]=df.loc[:,"売上"].astype(np.float32)

インデックスにdateカラムの値を設定してみます。

df=df.set_index("date")
df.head()
	日付	売上	来客数
date			
2023-01-01	2023-01-01	69989	51
2023-01-02	2023-01-02	78302	70
2023-01-03	2023-01-03	53671	25
2023-01-04	2023-01-04	86240	26
2023-01-05	2023-01-05	74553	89

並べ替え

sort_valuesメソッドを使って、売上で並べ替えます。デフォルトは昇順です。

df.sort_values(by="売上")
       日付	売上	来客数
date			
2023-01-17	2023-01-17	3682	57
2023-01-28	2023-01-28	15228	87
2023-01-18	2023-01-18	16169	10
2023-01-16	2023-01-16	16743	68
2023-01-13	2023-01-13	22210	84
・・・

降順に並べ替えます。

df.sort_values(by="売上",ascending=False)
                日付	売上	来客数
date			
2023-01-21	2023-01-21	99073	40
2023-01-07	2023-01-07	93566	67
2023-01-26	2023-01-26	93228	74
2023-01-19	2023-01-19	87110	84
2023-01-04	2023-01-04	86240	26
・・・

不要なカラムの削除

日付カラムが不要なためdropメソッドを使って削除します。
axisはインデックス値を指定します。

df=df.drop("日付",axis=1)
df
	     売上	来客数
date		
2023-01-01	69989	51
2023-01-02	78302	70
2023-01-03	53671	25
2023-01-04	86240	26
2023-01-05	74553	89

組み合わせデータの挿入

カラム同士の計算結果を新たなカラムに挿入することができます。
売上/来客数のカラムを作り挿入します。

df.loc[:,"売上/来客数"]=df.loc[:,"売上"]/df.loc[:,"来客数"]
df
売上	来客数	売上/来客数
date			
2023-01-01	69989	51	1372.333333
2023-01-02	78302	70	1118.600000
2023-01-03	53671	25	2146.840000
2023-01-04	86240	26	3316.923077
2023-01-05	74553	89	837.674157
・・・

ここで計算を関数化したプログラムを作ってみます。
新たに売上指数カラムを作ります。
売上/来客数が1000以下をLow、1000以上2000以下をMid、3000以上をHighとします。
sales_judgeという関数を定義します。

def sales_judge(sa):
    if sa <= 1000:
        return "Low"
    elif 1000 < sa <= 2000:
        return "Mid"
    else:
        return "High"
df.loc[:,"売上指数"]=df.loc[:,"売上/来客数"].apply(sales_judge)
df
            売上	来客数	売上/来客数	売上指数
date				
2023-01-01	69989	51	1372.333333	Mid
2023-01-02	78302	70	1118.600000	Mid
2023-01-03	53671	25	2146.840000	High
2023-01-04	86240	26	3316.923077	High
2023-01-05	74553	89	837.674157	Low

pickleを使いファイルに保存しておきます。

df.to_pickle("C:/data/sales.xlsx")

ここで売上指数に入っている[“High”,”Mid”,”Low”]のデータを3カラムに分割し「True」「False」で表示するようget_dummies関数を使って作成してみます。

get_dummies関数
文字列でカテゴリー分けされた性別などのデータを、男性を0、女性を1のように変換したり、多クラスの特徴量をone-hot表現に変換したりできる。機械学習の前処理として行うことが多い。

df_moved=pd.get_dummies(df.loc[:,"売上指数"],prefix="売上")
df_moved
	売上_High	売上_Low	売上_Mid
date			
2023-01-01	False	False	True
2023-01-02	False	False	True
2023-01-03	True	False	False
2023-01-04	True	False	False
2023-01-05	False	True	False
・・・

ファイルを保存しておきます。

df_moved.to_pickle("C:/data/sales_moved.pickle")

時系列データ

1ヵ月分のデータを作る

1ヵ月分の日付の配列を開始日及び終了日を設定して作成します。

dates=pd.date_range(start="2023-03-01",end="2023-03-31")
dates
DatetimeIndex(['2023-03-01', '2023-03-02', '2023-03-03', '2023-03-04',
               '2023-03-05', '2023-03-06', '2023-03-07', '2023-03-08',
               '2023-03-09', '2023-03-10', '2023-03-11', '2023-03-12',
               '2023-03-13', '2023-03-14', '2023-03-15', '2023-03-16',
               '2023-03-17', '2023-03-18', '2023-03-19', '2023-03-20',
               '2023-03-21', '2023-03-22', '2023-03-23', '2023-03-24',
               '2023-03-25', '2023-03-26', '2023-03-27', '2023-03-28',
               '2023-03-29', '2023-03-30', '2023-03-31'],
              dtype='datetime64[ns]', freq='D')

完成した日付の配列をインデックスにしたDateFrameを作り、データに乱数を設定します。

import random
np.random.seed(1230)
df=pd.DataFrame(np.random.randint(1,30,31),index=dates,columns=["乱数"])
df
	       乱数
2023-03-01	28
2023-03-02	28
2023-03-03	2
2023-03-04	10
2023-03-05	23
・・・

1年分365日のデータを作る

dates=pd.date_range(start="2023-01-01",periods=365)
dates
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
               '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08',
               '2023-01-09', '2023-01-10',
               ...
               '2023-12-22', '2023-12-23', '2023-12-24', '2023-12-25',
               '2023-12-26', '2023-12-27', '2023-12-28', '2023-12-29',
               '2023-12-30', '2023-12-31'],
              dtype='datetime64[ns]', length=365, freq='D')

完成した日付の配列をインデックスにしたDateFrameを作り、データに乱数を設定します。

np.random.seed(1230)
df=pd.DataFrame(np.random.randint(1,31,365),index=dates,columns=["乱数"])
df
	乱数
2023-01-01	28
2023-01-02	30
2023-01-03	28
2023-01-04	2
2023-01-05	10
...	...
2023-12-27	6
2023-12-28	9
2023-12-29	24
2023-12-30	19
2023-12-31	21
365 rows × 1 columns

月平均のデータにする

freq=’M’ → 月を指定
freq=’Y’ → 年を指定

df.groupby(pd.Grouper(freq='M')).mean()
	乱数
2023-01-31	15.354839
2023-02-28	14.678571
2023-03-31	15.612903
2023-04-30	14.933333
2023-05-31	16.290323
2023-06-30	14.533333
2023-07-31	14.225806
2023-08-31	16.193548
2023-09-30	14.466667
2023-10-31	15.322581
2023-11-30	17.300000
2023-12-31	14.548387

次の例では、引数のカラムを乱数に固定して、resampleメソッドを使い毎月に平均値を出力しています。

df.loc[:,"乱数"].resample('M').mean()
2023-01-31    15.354839
2023-02-28    14.678571
2023-03-31    15.612903
2023-04-30    14.933333
2023-05-31    16.290323
2023-06-30    14.533333
2023-07-31    14.225806
2023-08-31    16.193548
2023-09-30    14.466667
2023-10-31    15.322581
2023-11-30    17.300000
2023-12-31    14.548387
Freq: M, Name: 乱数, dtype: float64

複雑な条件のインデックス

1年分の日曜日の日付のデータを作成します。W-SUNは週ごとの日曜日を指定している。

pd.date_range(start="2023-01-01",end="2023-12-31",freq="W-SUN")
DatetimeIndex(['2023-01-01', '2023-01-08', '2023-01-15', '2023-01-22',
               '2023-01-29', '2023-02-05', '2023-02-12', '2023-02-19',
               '2023-02-26', '2023-03-05', '2023-03-12', '2023-03-19',
               '2023-03-26', '2023-04-02', '2023-04-09', '2023-04-16',
               '2023-04-23', '2023-04-30', '2023-05-07', '2023-05-14',
               '2023-05-21', '2023-05-28', '2023-06-04', '2023-06-11',
               '2023-06-18', '2023-06-25', '2023-07-02', '2023-07-09',
               '2023-07-16', '2023-07-23', '2023-07-30', '2023-08-06',
               '2023-08-13', '2023-08-20', '2023-08-27', '2023-09-03',
               '2023-09-10', '2023-09-17', '2023-09-24', '2023-10-01',
               '2023-10-08', '2023-10-15', '2023-10-22', '2023-10-29',
               '2023-11-05', '2023-11-12', '2023-11-19', '2023-11-26',
               '2023-12-03', '2023-12-10', '2023-12-17', '2023-12-24',
               '2023-12-31'],
              dtype='datetime64[ns]', freq='W-SUN')

1週間単位で乱数をまとめます。

df_year=pd.DataFrame(df.groupby(pd.Grouper(freq='W-SUN')).sum(),columns=['乱数'])
df_year
	乱数
2023-01-01	28
2023-01-08	99
2023-01-15	78
2023-01-22	138
2023-01-29	97
・・・

欠損値処理

欠損値とはNaNで表示されるものでデータが入っていない項目です。
欠損値が存在すると予期せぬ計算結果になる可能性があるため、欠損値を処理しておく必要があります。

import pandas as pd
df_deficit=pd.read_csv("C:/data/data.csv",encoding="utf-8",index_col='日付',parse_dates=True)
df_deficit
売上	来客数
日付		
2023-01-01	69989.0	51.0
2023-01-02	78302.0	70.0
2023-01-03	NaN	NaN
2023-01-04	86240.0	26.0
2023-01-05	74553.0	89.0
2023-01-06	49224.0	21.0
2023-01-07	NaN	NaN
2023-01-08	52820.0	64.0
2023-01-09	76983.0	37.0
2023-01-10	33345.0	60.0
2023-01-11	46629.0	73.0
2023-01-12	49661.0	47.0
2023-01-13	22210.0	84.0
2023-01-14	83898.0	69.0
2023-01-15	58561.0	34.0
2023-01-16	16743.0	68.0
2023-01-17	3682.0	57.0
2023-01-18	16169.0	10.0
2023-01-19	87110.0	84.0
2023-01-20	74743.0	70.0
2023-01-21	99073.0	40.0
2023-01-22	80673.0	41.0
2023-01-23	68824.0	21.0
2023-01-24	48194.0	31.0
2023-01-25	52180.0	79.0
2023-01-26	93228.0	74.0
2023-01-27	48630.0	69.0
2023-01-28	15228.0	87.0
2023-01-29	33949.0	17.0
2023-01-30	39738.0	50.0

dropnaメソッドを使って欠損値の行を削除します。

df_deficit_drop=df_deficit.dropna()
df_deficit_drop
	売上	来客数
日付		
2023-01-01	69989.0	51.0
2023-01-02	78302.0	70.0
2023-01-04	86240.0	26.0
2023-01-05	74553.0	89.0
2023-01-06	49224.0	21.0
2023-01-08	52820.0	64.0
2023-01-09	76983.0	37.0
2023-01-10	33345.0	60.0
2023-01-11	46629.0	73.0
2023-01-12	49661.0	47.0
2023-01-13	22210.0	84.0
2023-01-14	83898.0	69.0
2023-01-15	58561.0	34.0
2023-01-16	16743.0	68.0
2023-01-17	3682.0	57.0
2023-01-18	16169.0	10.0
2023-01-19	87110.0	84.0
2023-01-20	74743.0	70.0
2023-01-21	99073.0	40.0
2023-01-22	80673.0	41.0
2023-01-23	68824.0	21.0
2023-01-24	48194.0	31.0
2023-01-25	52180.0	79.0
2023-01-26	93228.0	74.0
2023-01-27	48630.0	69.0
2023-01-28	15228.0	87.0
2023-01-29	33949.0	17.0
2023-01-30	39738.0	50.0

fillnaメソッドに0を設定して欠損値に0を代入します。

df_deficit_fillna=df_deficit.fillna(0)
df_deficit_fillna
	売上	来客数
日付		
2023-01-01	69989.0	51.0
2023-01-02	78302.0	70.0
2023-01-03	0.0	0.0
2023-01-04	86240.0	26.0
2023-01-05	74553.0	89.0
2023-01-06	49224.0	21.0
2023-01-07	0.0	0.0
2023-01-08	52820.0	64.0
2023-01-09	76983.0	37.0
2023-01-10	33345.0	60.0
2023-01-11	46629.0	73.0
2023-01-12	49661.0	47.0
2023-01-13	22210.0	84.0
2023-01-14	83898.0	69.0
2023-01-15	58561.0	34.0
2023-01-16	16743.0	68.0
2023-01-17	3682.0	57.0
2023-01-18	16169.0	10.0
2023-01-19	87110.0	84.0
2023-01-20	74743.0	70.0
2023-01-21	99073.0	40.0
2023-01-22	80673.0	41.0
2023-01-23	68824.0	21.0
2023-01-24	48194.0	31.0
2023-01-25	52180.0	79.0
2023-01-26	93228.0	74.0
2023-01-27	48630.0	69.0
2023-01-28	15228.0	87.0
2023-01-29	33949.0	17.0
2023-01-30	39738.0	50.0

fillnaメソッドにmethod=”ffill”を設定して欠損値を1つ手前の値で補完します。

df_deficit_fill=df_deficit.fillna(method="ffill")
df_deficit_fill
売上	来客数
日付		
2023-01-01	69989.0	51.0
2023-01-02	78302.0	70.0
2023-01-03	78302.0	70.0
2023-01-04	86240.0	26.0
2023-01-05	74553.0	89.0
2023-01-06	49224.0	21.0
2023-01-07	49224.0	21.0
2023-01-08	52820.0	64.0
2023-01-09	76983.0	37.0
2023-01-10	33345.0	60.0
2023-01-11	46629.0	73.0
2023-01-12	49661.0	47.0
2023-01-13	22210.0	84.0
2023-01-14	83898.0	69.0
2023-01-15	58561.0	34.0
2023-01-16	16743.0	68.0
2023-01-17	3682.0	57.0
2023-01-18	16169.0	10.0
2023-01-19	87110.0	84.0
2023-01-20	74743.0	70.0
2023-01-21	99073.0	40.0
2023-01-22	80673.0	41.0
2023-01-23	68824.0	21.0
2023-01-24	48194.0	31.0
2023-01-25	52180.0	79.0
2023-01-26	93228.0	74.0
2023-01-27	48630.0	69.0
2023-01-28	15228.0	87.0
2023-01-29	33949.0	17.0
2023-01-30	39738.0	50.0

fillnaメソッドにdf_deficit.mean()を与えることで欠損値を他の値の平均値で補完できます。

df_deficit_fillmean=df_deficit.fillna(df_deficit.mean())
df_deficit_fillmean
	売上	来客数
日付		
2023-01-01	69989.000000	51.000000
2023-01-02	78302.000000	70.000000
2023-01-03	55734.964286	54.392857
2023-01-04	86240.000000	26.000000
2023-01-05	74553.000000	89.000000
2023-01-06	49224.000000	21.000000
2023-01-07	55734.964286	54.392857
2023-01-08	52820.000000	64.000000
2023-01-09	76983.000000	37.000000
2023-01-10	33345.000000	60.000000
2023-01-11	46629.000000	73.000000
2023-01-12	49661.000000	47.000000
2023-01-13	22210.000000	84.000000
2023-01-14	83898.000000	69.000000
2023-01-15	58561.000000	34.000000
2023-01-16	16743.000000	68.000000
2023-01-17	3682.000000	57.000000
2023-01-18	16169.000000	10.000000
2023-01-19	87110.000000	84.000000
2023-01-20	74743.000000	70.000000
2023-01-21	99073.000000	40.000000
2023-01-22	80673.000000	41.000000
2023-01-23	68824.000000	21.000000
2023-01-24	48194.000000	31.000000
2023-01-25	52180.000000	79.000000
2023-01-26	93228.000000	74.000000
2023-01-27	48630.000000	69.000000
2023-01-28	15228.000000	87.000000
2023-01-29	33949.000000	17.000000
2023-01-30	39738.000000	50.000000

データ連結

DataFrame同士の連結を行います。
まずはpickleで保存したデータを読み込みます。

df=pd.read_pickle("C:/data/sales.pickle")
df
売上	来客数	売上/来客数	売上指数
date				
2023-01-01	69989	51	1372.333333	Mid
2023-01-02	78302	70	1118.600000	Mid
2023-01-03	53671	25	2146.840000	High
2023-01-04	86240	26	3316.923077	High
2023-01-05	74553	89	837.674157	Low
2023-01-06	49224	21	2344.000000	High
2023-01-07	93566	67	1396.507463	Mid
2023-01-08	52820	64	825.312500	Low
2023-01-09	76983	37	2080.621622	High
2023-01-10	33345	60	555.750000	Low
2023-01-11	46629	73	638.753425	Low
2023-01-12	49661	47	1056.617021	Mid
2023-01-13	22210	84	264.404762	Low
2023-01-14	83898	69	1215.913043	Mid
2023-01-15	58561	34	1722.382353	Mid
2023-01-16	16743	68	246.220588	Low
2023-01-17	3682	57	64.596491	Low
2023-01-18	16169	10	1616.900000	Mid
2023-01-19	87110	84	1037.023810	Mid
2023-01-20	74743	70	1067.757143	Mid
2023-01-21	99073	40	2476.825000	High
2023-01-22	80673	41	1967.634146	Mid
2023-01-23	68824	21	3277.333333	High
2023-01-24	48194	31	1554.645161	Mid
2023-01-25	52180	79	660.506329	Low
2023-01-26	93228	74	1259.837838	Mid
2023-01-27	48630	69	704.782609	Low
2023-01-28	15228	87	175.034483	Low
2023-01-29	33949	17	1997.000000	Mid
2023-01-30	39738	50	794.760000	Low
df_moved=pd.read_pickle("C:/data/sales_moved.pickle")
df_moved
	売上_High	売上_Low	売上_Mid
date			
2023-01-01	False	False	True
2023-01-02	False	False	True
2023-01-03	True	False	False
2023-01-04	True	False	False
2023-01-05	False	True	False
2023-01-06	True	False	False
2023-01-07	False	False	True
2023-01-08	False	True	False
2023-01-09	True	False	False
2023-01-10	False	True	False
2023-01-11	False	True	False
2023-01-12	False	False	True
2023-01-13	False	True	False
2023-01-14	False	False	True
2023-01-15	False	False	True
2023-01-16	False	True	False
2023-01-17	False	True	False
2023-01-18	False	False	True
2023-01-19	False	False	True
2023-01-20	False	False	True
2023-01-21	True	False	False
2023-01-22	False	False	True
2023-01-23	True	False	False
2023-01-24	False	False	True
2023-01-25	False	True	False
2023-01-26	False	False	True
2023-01-27	False	True	False
2023-01-28	False	True	False
2023-01-29	False	False	True
2023-01-30	False	True	False

dfとdf_movedを連結します。

列方向へのデータ連結

concat関数を使い、引数に2つのDataFrameをリストにして渡します。axis=1を引数に加えることで列方向への連結となります。

df_merged=pd.concat([df,df_moved],axis=1)
df_merged
売上	来客数	売上/来客数	売上指数	売上_High	売上_Low	売上_Mid
date							
2023-01-01	69989	51	1372.333333	Mid	False	False	True
2023-01-02	78302	70	1118.600000	Mid	False	False	True
2023-01-03	53671	25	2146.840000	High	True	False	False
2023-01-04	86240	26	3316.923077	High	True	False	False
2023-01-05	74553	89	837.674157	Low	False	True	False
2023-01-06	49224	21	2344.000000	High	True	False	False
2023-01-07	93566	67	1396.507463	Mid	False	False	True
2023-01-08	52820	64	825.312500	Low	False	True	False
2023-01-09	76983	37	2080.621622	High	True	False	False
2023-01-10	33345	60	555.750000	Low	False	True	False
2023-01-11	46629	73	638.753425	Low	False	True	False
2023-01-12	49661	47	1056.617021	Mid	False	False	True
2023-01-13	22210	84	264.404762	Low	False	True	False
2023-01-14	83898	69	1215.913043	Mid	False	False	True
2023-01-15	58561	34	1722.382353	Mid	False	False	True
2023-01-16	16743	68	246.220588	Low	False	True	False
2023-01-17	3682	57	64.596491	Low	False	True	False
2023-01-18	16169	10	1616.900000	Mid	False	False	True
2023-01-19	87110	84	1037.023810	Mid	False	False	True
2023-01-20	74743	70	1067.757143	Mid	False	False	True
2023-01-21	99073	40	2476.825000	High	True	False	False
2023-01-22	80673	41	1967.634146	Mid	False	False	True
2023-01-23	68824	21	3277.333333	High	True	False	False
2023-01-24	48194	31	1554.645161	Mid	False	False	True
2023-01-25	52180	79	660.506329	Low	False	True	False
2023-01-26	93228	74	1259.837838	Mid	False	False	True
2023-01-27	48630	69	704.782609	Low	False	True	False
2023-01-28	15228	87	175.034483	Low	False	True	False
2023-01-29	33949	17	1997.000000	Mid	False	False	True
2023-01-30	39738	50	794.760000	Low	False	True	False

行方向へのデータ連結

concat関数を使い、引数に2つのDataFrameをリストにして渡します。axis=0を引数に加えることで行方向への連結となります。

df_merged2=pd.concat([df,df_moved],axis=0)
df_merged2
	売上	来客数	売上/来客数	売上指数	売上_High	売上_Low	売上_Mid
date							
2023-01-01	69989.0	51.0	1372.333333	Mid	NaN	NaN	NaN
2023-01-02	78302.0	70.0	1118.600000	Mid	NaN	NaN	NaN
2023-01-03	53671.0	25.0	2146.840000	High	NaN	NaN	NaN
2023-01-04	86240.0	26.0	3316.923077	High	NaN	NaN	NaN
2023-01-05	74553.0	89.0	837.674157	Low	NaN	NaN	NaN
2023-01-06	49224.0	21.0	2344.000000	High	NaN	NaN	NaN
2023-01-07	93566.0	67.0	1396.507463	Mid	NaN	NaN	NaN
2023-01-08	52820.0	64.0	825.312500	Low	NaN	NaN	NaN
2023-01-09	76983.0	37.0	2080.621622	High	NaN	NaN	NaN
2023-01-10	33345.0	60.0	555.750000	Low	NaN	NaN	NaN
2023-01-11	46629.0	73.0	638.753425	Low	NaN	NaN	NaN
2023-01-12	49661.0	47.0	1056.617021	Mid	NaN	NaN	NaN
2023-01-13	22210.0	84.0	264.404762	Low	NaN	NaN	NaN
2023-01-14	83898.0	69.0	1215.913043	Mid	NaN	NaN	NaN
2023-01-15	58561.0	34.0	1722.382353	Mid	NaN	NaN	NaN
2023-01-16	16743.0	68.0	246.220588	Low	NaN	NaN	NaN
2023-01-17	3682.0	57.0	64.596491	Low	NaN	NaN	NaN
2023-01-18	16169.0	10.0	1616.900000	Mid	NaN	NaN	NaN
2023-01-19	87110.0	84.0	1037.023810	Mid	NaN	NaN	NaN
2023-01-20	74743.0	70.0	1067.757143	Mid	NaN	NaN	NaN
2023-01-21	99073.0	40.0	2476.825000	High	NaN	NaN	NaN
2023-01-22	80673.0	41.0	1967.634146	Mid	NaN	NaN	NaN
2023-01-23	68824.0	21.0	3277.333333	High	NaN	NaN	NaN
2023-01-24	48194.0	31.0	1554.645161	Mid	NaN	NaN	NaN
2023-01-25	52180.0	79.0	660.506329	Low	NaN	NaN	NaN
2023-01-26	93228.0	74.0	1259.837838	Mid	NaN	NaN	NaN
2023-01-27	48630.0	69.0	704.782609	Low	NaN	NaN	NaN
2023-01-28	15228.0	87.0	175.034483	Low	NaN	NaN	NaN
2023-01-29	33949.0	17.0	1997.000000	Mid	NaN	NaN	NaN
2023-01-30	39738.0	50.0	794.760000	Low	NaN	NaN	NaN
2023-01-01	NaN	NaN	NaN	NaN	False	False	True
2023-01-02	NaN	NaN	NaN	NaN	False	False	True
2023-01-03	NaN	NaN	NaN	NaN	True	False	False
・・・
2023-01-30	NaN	NaN	NaN	NaN	False	True	False

統計データの扱い

まずはpickleで保存したデータを読み込みます。

df=pd.read_pickle("C:/data/sales.pickle")
df
売上	来客数	売上/来客数	売上指数
date				
2023-01-01	69989	51	1372.333333	Mid
2023-01-02	78302	70	1118.600000	Mid
2023-01-03	53671	25	2146.840000	High
2023-01-04	86240	26	3316.923077	High
2023-01-05	74553	89	837.674157	Low
2023-01-06	49224	21	2344.000000	High
2023-01-07	93566	67	1396.507463	Mid
2023-01-08	52820	64	825.312500	Low
2023-01-09	76983	37	2080.621622	High
2023-01-10	33345	60	555.750000	Low
2023-01-11	46629	73	638.753425	Low
2023-01-12	49661	47	1056.617021	Mid
2023-01-13	22210	84	264.404762	Low
2023-01-14	83898	69	1215.913043	Mid
2023-01-15	58561	34	1722.382353	Mid
2023-01-16	16743	68	246.220588	Low
2023-01-17	3682	57	64.596491	Low
2023-01-18	16169	10	1616.900000	Mid
2023-01-19	87110	84	1037.023810	Mid
2023-01-20	74743	70	1067.757143	Mid
2023-01-21	99073	40	2476.825000	High
2023-01-22	80673	41	1967.634146	Mid
2023-01-23	68824	21	3277.333333	High
2023-01-24	48194	31	1554.645161	Mid
2023-01-25	52180	79	660.506329	Low
2023-01-26	93228	74	1259.837838	Mid
2023-01-27	48630	69	704.782609	Low
2023-01-28	15228	87	175.034483	Low
2023-01-29	33949	17	1997.000000	Mid
2023-01-30	39738	50	794.760000	Low

基本統計量

maxメソッドを使って最大値を出力します。

df.loc[:,"売上"].max()
99073

minメソッドを使って最小値を出力します。

df.loc[:,"売上"].min()
3682

modeメソッドを使って最頻値を出力します。

df.loc[:,"来客数"].mode()
0    21
1    69
2    70
3    84
Name: 来客数, dtype: int64

meanメソッドを使って算術平均(平均値)を出力します。

df.loc[:,"来客数"].mean()
53.833333333333336

medianメソッドを使って中央値を出力します。

df.loc[:,"来客数"].median()
58.5

stdメソッドを使って標準偏差を出力します。

df.loc[:,"売上"].std()
26358.277688749724

stdメソッドを使って、母集団の標準偏差を出力する場合は、stdメソッドにddof=0を指定します。(デフォルトはddof=1)

df.loc[:,"売上"].std(ddof=0)
25915.249872613615

countメソッドを使って件数を出力します。
売上が20000以上のデータの件数を出力します。

df[df.loc[:,"売上"]>=20000].count()
売上        26
来客数       26
売上/来客数    26
売上指数      26
dtype: int64

要約

describeメソッドを使って、DataFrameの統計量をまとめて出力します。

df.describe()
	        売上	来客数	売上/来客数
count	30.000000	30.000000	30.000000
mean	56927.200000	53.833333	1326.449656
std	26358.277689	23.294343	844.766729
min	3682.000000	10.000000	64.596491
25%	41460.750000	34.750000	727.276957
50%	53245.500000	58.500000	1167.256522
75%	77972.250000	70.000000	1906.321198
max	99073.000000	89.000000	3316.923077

相関関係

カラム間のデータの関係を数値で確認し、相関関係を出力します。

df.corr()
	        売上	来客数	売上/来客数
売上	1.000000	0.043964	0.518586
来客数	0.043964	1.000000	-0.761210
売上/来客数	0.518586	-0.761210	1.000000

散布図行列

Jupyter Notebookの場合、最初に下記マジックコマンドを実行します。

%matplotlib inLine

散布図行列を出力する関数をインポートします。

from pandas.plotting import scatter_matrix

scatter関数に、引数としてDataFrameを渡すと散布図行列が出力されます。

_ = scatter_matrix(df)

データ変換

機械学習フレームワークによっては、pandasのDataFrameは受け取れないことがあります。
Numpyの配列(ndarray)しか受け付けない場合もあります。
そのため、pandasのDataFrameをNumpyの配列(ndarray)に変換する方法を確認しましょう。

df.loc[:,["売上","来客数"]]
	売上	来客数
date		
2023-01-01	69989	51
2023-01-02	78302	70
2023-01-03	53671	25
2023-01-04	86240	26
2023-01-05	74553	89
2023-01-06	49224	21
2023-01-07	93566	67
2023-01-08	52820	64
2023-01-09	76983	37
2023-01-10	33345	60
2023-01-11	46629	73
2023-01-12	49661	47
2023-01-13	22210	84
2023-01-14	83898	69
2023-01-15	58561	34
2023-01-16	16743	68
2023-01-17	3682	57
2023-01-18	16169	10
2023-01-19	87110	84
2023-01-20	74743	70
2023-01-21	99073	40
2023-01-22	80673	41
2023-01-23	68824	21
2023-01-24	48194	31
2023-01-25	52180	79
2023-01-26	93228	74
2023-01-27	48630	69
2023-01-28	15228	87
2023-01-29	33949	17
2023-01-30	39738	50

上記のpandasのDataFrameをNumpy(ndaaray)に変換します。values属性を使用します。

df.loc[:,["売上","来客数"]].values
array([[69989,    51],
       [78302,    70],
       [53671,    25],
       [86240,    26],
       [74553,    89],
       [49224,    21],
       [93566,    67],
       [52820,    64],
       [76983,    37],
       [33345,    60],
       [46629,    73],
       [49661,    47],
       [22210,    84],
       [83898,    69],
       [58561,    34],
       [16743,    68],
       [ 3682,    57],
       [16169,    10],
       [87110,    84],
       [74743,    70],
       [99073,    40],
       [80673,    41],
       [68824,    21],
       [48194,    31],
       [52180,    79],
       [93228,    74],
       [48630,    69],
       [15228,    87],
       [33949,    17],
       [39738,    50]], dtype=int64)

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。