Tips: MathematicaでExcelデータをデータセットとして読むこむ
Tips: MathematicaでExcelデータをデータセットとして読むこむ
Key関数:Import, DataSet
カレントディレクトリに以下のような Excel ファイルがあるとします。
In[]:=
SetDirectory[NotebookDirectory[]]
Out[]=
/Users/skybird/Desktop/work/Programs/Mathematica
従来は Import でリスト形式で読んでいましたが
In[]:=
Import["fruits.xlsx"]
Out[]=
種類,単価,個数,リンゴ,200.,120.,みかん,100.,200.,バナナ,250.,100.,ぶどう,400.,150.
Mathematica ver10.0 以降は DataSet 形式で読めるようになりました。DataSet 形式は Python でいうところの DataFrame に似てます。なお、最後の 〚1〛 は複数想定される Excel シートの1枚目を指します。
In[]:=
fruits=Import["fruits.xlsx","Dataset","HeaderLines"->1][[1]]
Out[]=
検索
検索
みかんの値段を調べてみます。
In[]:=
fruits[[2,2]]
Out[]=
100.
果物の値段の平均を計算します。
In[]:=
fruits[Mean,"単価"]
Out[]=
237.5
全果物の売上総数を計算します。
In[]:=
fruits[Total,"個数"]
Out[]=
570.
最大売上個数を求めます。
In[]:=
fruits[Max,"個数"]
Out[]=
200.
データを単価の小さい順に並び替えます。
In[]:=
fruits[SortBy["単価"]]
Out[]=
データを単価の大きい順に並び替えます。
In[]:=
fruits[SortBy["単価"]][Reverse]
Out[]=
単価が200円を超えるデータのみを取り出します。
In[]:=
fruits[Select[#単価>200&]]
Out[]=
加工
加工
Dataset は高速にデータを処理できる一方、加工に弱いという誤解が広まっていて、加工したいときは、いったん Association に変換し、その上で加工し、再度 Dataset に戻すという習慣が広まっているようです。たとえば、以下のような要請「DataSet fruits に合計(= 単価 * 個数)欄を追加する」にも、新規カラムの追加で簡単に対応できます。
In[]:=
fruits=fruits[All,Append[#,"合計"->#単価*#個数]&]
Out[]=
このとき、全売上総計は次のようになります。
In[]:=
fruits[Total,"合計"]
Out[]=
129000.
一方、Mathematica のヘルプには、たとえば、guide/DatabaseLikeOperationsOnDatasets のようなページはあっても Dataset に対する具体的な操作例は紹介されていません。対策は簡単で、Association に対する操作から連想します。次は JoinAcross の例で、月 moon をキーに2つの Dataset を 結合します。
In[]:=
planets= <|"Planet""Earth","Moon""Luna"|>, <|"Planet""Mars","Moon""Phobos"|>, <|"Planet""Mars","Moon""Deimos"|>, <|"Planet""Jupiter","Moon""Calipso"|>;planetsDS=Dataset[planets]
Out[]=
In[]:=
moons= <|"Moon""Luna","Mass"3|>, <|"Moon""Phobos","Mass"1|>, <|"Moon""Deimos","Mass"2|>, <|"Moon""X","Mass"100|>;moonsDS=Dataset[moons]
Out[]=
いったん Association 上で結合し、Dataset に変換しています。
In[]:=
JoinAcross[planets,moons,"Moon","Inner"]//Dataset
Out[]=
Dataset に対し、直接、結合しています。
Datasetのリストへの変換
Datasetのリストへの変換
DataSet を 連想形式 Association に変換します。
DataSet をリスト形式に変換します。
DataSet を {key, value} 形式のリストに変換します( は :> で入力)。