期間をそろえたデータセット同士を結合するのがmerge関数です。ここではIn [18]とIn [19]で生成した2つのDataFrameを結合しています(In [20])。
このケースでは2つのデータのインデックスをキーにして結合していますが、列をキーに指定して結合することもできます。また、リレーショナルデータベースのように、howオプションで'left'、'right'、'outer'、'inner'など結合方法を指定することもできます。
In [17]: # 2つのデータセット(DataFrame)の結合 In [18]: df_left = pd.DataFrame(df.actual.values, index=idx, columns=['actual']) In [19]: df_right = pd.DataFrame(np.random.randn(len(idx)), index=idx, columns=['rand']) In [20]: pd.merge(df_left, df_right, left_index=True, right_index=True).head(10) Out[20]: actual rand 2013-01-01 00:00:00 2873 0.434061 2013-01-01 01:00:00 2716 1.215734 2013-01-01 02:00:00 2592 -0.054606 2013-01-01 03:00:00 2482 -0.165443 2013-01-01 04:00:00 2412 0.987701 2013-01-01 05:00:00 2405 -0.359786 2013-01-01 06:00:00 2499 -0.352796 2013-01-01 07:00:00 2646 -0.798894 2013-01-01 08:00:00 2778 -0.914047 2013-01-01 09:00:00 2773 0.973519
続いてデータをランダムにサンプリングして抽出する方法を紹介します。ここでは、pythonのrandom関数を使い、データ数の範囲内でランダムに100個の整数を発生させ(In [22])、データセットから100個のデータを抽出しています(In [24])。
In [21]: # サンプリング In [22]: samples = np.random.randint(0, len(df), size=100) In [23]: samples Out[23]: array([1305, 3811, 1906, 885, 983, 2114, 102, 3713, 1718, 2995, 1837, 219, 2605, 3709, 1490, 3706, 130, 1788, 1347, 3327, 132, 1851, 134, 3774, 3476, 3593, 1327, 1164, 2151, 2093, 1144, 3832, 2784, 924, 2244, 2557, 2335, 359, 4036, 1780, 1016, 3752, 1371, 1680, 75, 2647, 96, 784, 3876, 938, 378, 591, 1744, 748, 4079, 3839, 2862, 901, 842, 1997, 697, 2442, 126, 733, 2552, 2042, 3026, 3685, 383, 3453, 215, 393, 1198, 3338, 1141, 1852, 1441, 1738, 4183, 1838, 128, 1980, 632, 141, 1012, 3000, 2615, 2498, 3623, 713, 2683, 3862, 417, 2912, 3264, 1278, 1510, 3809, 753, 3830]) In [24]: df.take(samples) Out[24]: <class 'pandas.core.frame.DataFrame'> Int64Index: 100 entries, 1305 to 3830 Data columns (total 3 columns): date 100 non-null values time 100 non-null values actual 100 non-null values dtypes: int64(1), object(2) In [25]: df.take(samples).head(10) Out[25]: date time actual 1305 2013/2/24 9:00 3442 3811 2013/6/8 19:00 3229 1906 2013/3/21 10:00 3382 885 2013/2/6 21:00 4096 983 2013/2/10 23:00 3281 2114 2013/3/30 2:00 2520 102 2013/1/5 6:00 2974 3713 2013/6/4 17:00 3461 1718 2013/3/13 14:00 3295 2995 2013/5/5 19:00 2866
データセットの列名を変更することも可能です。pythonのrename関数を使って大文字や小文字にそろえたり(In [27]、In [28])名称を変更する(In [29])こともできます。
In [26]: # 列名の変更 In [27]: df.rename(columns=str.upper) Out[27]: <class 'pandas.core.frame.DataFrame'> Int64Index: 4200 entries, 0 to 4199 Data columns (total 3 columns): DATE 4200 non-null values TIME 4200 non-null values ACTUAL 4200 non-null values dtypes: int64(1), object(2) In [28]: df.rename(columns=str.lower) Out[28]: <class 'pandas.core.frame.DataFrame'> Int64Index: 4200 entries, 0 to 4199 Data columns (total 3 columns): date 4200 non-null values time 4200 non-null values actual 4200 non-null values dtypes: int64(1), object(2) In [29]: df.rename(columns={'date' : 'd'}) Out[29]: <class 'pandas.core.frame.DataFrame'> Int64Index: 4200 entries, 0 to 4199 Data columns (total 3 columns): d 4200 non-null values time 4200 non-null values actual 4200 non-null values dtypes: int64(1), object(2)
ここまではCSVなどの形式で、整形済みのデータを扱うことを中心に説明してきましたが、OSのシステムログやWebのアクセスログなどは明確な区切り文字がなかったり、文字列を分解してテータを取り出す必要があります。次ページでは、形式が明確でないデータを分析できる状態にする方法を紹介していきます。
Copyright © ITmedia, Inc. All Rights Reserved.