Python:DataFrameから列を取り出して配列(リスト)にする方法
Python:DataFrameから列を取り出して配列(リスト)にする方法
なかなか思う通りに成形できず苦戦してました。
その上で今思っているのは「pandasを自在に操れる程度に覚えればデータベース操作は思い通りだろう」と言う事。
最終目的地は【検索に有効な商品名を自動でつける】なのでそこに向かうにはどうしてもマスタしなくては。
DataFrameって数学の行列を思い出せば理解早いかも
最初は得体のしれない配列の形と思っていたDataFrameですが、それなりに扱いを覚え「色んなことできるんだなぁ」と思えるようになってきました。
解釈の土台は数学の行列。あの大きなカッコで囲まれた中に数字が入ってたやつです。
列ベクトルとか行ベクトルとかやりましたよね、あれです。
そう考えれば、縦ベクトルの取り出しとか行列の入れ替えとかできない訳が無いと。
で、調べてみるとやっぱりできるんですよ。
その上に取り出した縦ベクトルをJSON変換なんてことまで出来てしまいます。
データの視覚化には重宝する機能が満載でした。
DataFrameから列/行の取り出し
コマンド | 動作 |
---|---|
df[“列_A”] | A列をSeriesとして取り出す |
df.列_A | A列をSeriesとして取り出す |
df[0:2] | 0~2行目取得 |
df[:3] | 0~3行目取得 |
df[“インデックスA”:”インデックスB”] | インデックスA~インデックスBの行を取り出す |
df.loc[“インデックスA”] | インデックスAの『行』を取り出す |
df.loc[:, [“列_A”, “列_B”]] | 列_Aと列_Bの列を取り出す |
df.loc[“インデックスA”:”インデックスB”,[“列_A”, “列_B”]] | インデックスA~インデックスBの行の列_Aと列_B |
df.iloc[0] | 0行目取得 |
df.iloc[1][1] | 1行目の1列目取得 |
df.iloc[[1, 2],[0, 1]] | 1, 2行目の0, 1列を取得 |
df.iloc[1:2, :] | 1~2行目のすべての列を取得 |
df.iloc[:, 0:1] | すべての行の0~1列を取得 |
df.at[“インデックスA”, “列_B”] | インデックスAの行の列_B |
df.iat[1, 2] | 1行目の2列目を取得 |
df[df.列_A > 5] | 列_Aの値が5より大きいすべての行 |
df.[df > 5] | 5より大きいすべての要素を抽出 ※5以下はNaNになる |
df[df[“列_A”].isin([1, 1000])] | 列_Aに 1 または 1000 の値を持つ行。※isinの引数はリスト型 |
DataFrameが行列なら指定列の取り出しとか行の合計とか出せると思って調べてみました。
やっぱりそういった操作ができるんですね。
【行列】と【配列】って何が違う?
ここまで調べて解らなくなってきたのが【行列】と【配列】の違い。
元々PHPPERな私は配列をいじくるのが基本。行列は余り馴染みがありません。
そんな状態で自分の頭を整理した結果次のように覚えようと思いました。
- 【配列】:行を重視したレコード集。行ごとの比較や取出しは容易で速い。 具体的にはSQL
- 【行列】:切り口で行/列どちらも1つのレコードとして扱え、縦横の入替も可能。
実際の所、配列から特定の列を取得しようとした場合、phpでは『foreach して空配列に1件づつ格納』という方法が採用されます。PythonのDataFrameではこれが1つの命令で終了してしまうと、ここら辺がPHPPERな私には驚愕でした。
行列の入替も出来ちゃうし。「Pandasスゲー!」です。
充実しているデータ取得/変換用【to_メニュー】
- to_csv : CSVファイルの書き出し
- to_gbq : GoogleBigQueryテーブルに書き込み
- to_hdf : HDF5ファイルに書き込み
- to_sql : SQLデータベースに書き込み
- to_dict : 辞書(dict型object)に変換
- to_clipboard : クリップボードにコピー
- to_excel : Excelファイル(拡張子: .xlsx, .xls)として書き出し
- to_feather : バイナリフェザー形式に書き込み
- to_html : HTMLテーブルとしてレンダリング
- to_json : JSONファイルとして出力
- to_latex : オブジェクトをLaTeXの表形式、longtable形式、またはネストされた表/表形式にレンダリング
- to_makedown : マークダウンに適した形式でDataFrameを印刷
- to_numpv : NumPy配列に変換
- to_parquet : バイナリparquetの形式に書き込み
- to_period : DatetimeIndexからPeriodIndexに変換
- to_pickle : ファイルにPickle化する
- to_records : NumPyレコード配列に変換
- to_stata : Stataデータセットファイルに書き込み
- to_string : コンソールに適した表形式の出力にレンダリング
- to_timespan : 期間の開始時にタイムスタンプのDatetimeIndexにキャスト
- to_xarray : pandasオブジェクトからxarrayオブジェクトを返す
今現状理解できないモノが多いけど「コマンド一発でjsonやCSV変換できる」「sqlへの保存まで一発」と言うあたりは多用しそうです。
行/列の取り出しとto_メニューを組み合わせて使うと破壊力抜群
toメニューの13項目【to_numpy】とtolistを使うとPHPでお馴染みの多次元配列を作成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import pandas as pd df = pd.read_excel(hogehoge.xlsx) #numpy.ndarrayに変換⇒ndarrayのtolistメソッドでリスト化 dt_list = df.to_numpy().tolist() print(dt_list) """出力結果""" dt_list = [ ['フライパン',100,50], ['鍋',70,20], ['ほうき',20,5] ] |
その他にもjsonを描写してくれるグラフがあるとしたら下の様な段取りでグラフ化が完了します。
- グラフ描写したい目的の列を取り出す
- インデックスと合わせてグラフ描写スクリプトに投げる
- グラフ化完了
実際にはグラフ描写スクリプトに知見が無いと苦戦はしますが、データ成形はとても楽です。
もちろんリストで渡した方がいいグラフの場合は【to_numpy + tolist】で渡せばOKです。
まとめ
最初は使いにくいと思っていたpandasですが、だいぶ慣れてきました。
そうなると、列取出しにforeachを仕掛けなくてよい分「楽だなぁ」と思えるようになりました。
速度も速いですしね。
まだ苦戦するのがインデックスの値を渡し忘れたりする所。
これも慣れなんだとは思いますけど。
-
前の記事
SEOワードの有効性と関係性を視覚化してみる 2021.01.06
-
次の記事
Laravel:カンマの付いた数字を含むCSVデータをMySQLにConvertする方法 2021.01.08
コメントを残す