hitochan007のブログ(Pythonの勉強ブログ)

★Pythonの勉強記録を中心に●pomera DM200、●パソコン、●グルメ、●愛犬(トイプードル) などについてのブログです


テーマ:

ブログランキング参加しました。下のバナーをポチッとしていただけると助かります。↓

Python ブログランキングへ



久しぶりのpython記事です。
pandasのデータ処理により、グラフ描画を簡単にしようという試みを続けていますが、なかなか進んでいません。今回、データ間引きが簡単にできるという記事です。


■pandas:重要な機能■
●1.ダウンサンプリングはスライスにヒントあり
●2.スライスについて
●3.スライスの仕組み



●1.ダウンサンプリングはスライスにヒントあり


pandasで使うデータフレームですが、ダウンサンプリングいわゆるデータ間引きについて調べても時系列のインデックスに対して行うことで、単純に「5個おきにデータを減らしたい」などという内容をみつけられませんでした。

ところが、ふとしたことでスライスに関する情報を見て、目から鱗が落ちました。簡単にデータ間引きができることがわかったのです。

IPythonで確認しました。↓


スライスによるデータ間引き

In [10]: a
Out[10]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

In [11]: a[::5]
Out[11]: [0, 5, 10, 15]



たったこれだけです。たとえば、a[::i] とすればiに数値を入力すればスキップ数を変更できます。pandasの解説書にも載っていないはずです。pythonの基本的機能に存在しているのですから・・・

あらためて、pythonが素晴らしいプログラム言語であることを再認識しました。惚れ直しました。



●2.スライスについて


せっかくですので、スライスについての情報メモを示したいと思います。
スライスはリストからデータを簡単切り出すことのできる優れものです。

以下はスライスの例です。


スライスの例


まずリストを準備します。

a=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]

① すべてのデータ

In [13]: a[:]
Out[13]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

In [14]: a[0:]
Out[14]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

In [15]: a[::1]
Out[15]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

② 1以上

In [16]: a[1:]
Out[16]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

③ 2以上5未満

In [17]: a[2:5]
Out[17]: [2, 3, 4]

④ 最後から二番目以降

In [19]: a[-2:]
Out[19]: [18, 19]

⑤ 2個おき

In [21]: a[::2]
Out[21]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

⑥ 5個おき

In [22]: a[::5]
Out[22]: [0, 5, 10, 15]


⑦ 逆から5個おき

In [23]: a[::-5]
Out[23]: [19, 14, 9, 4]

⑧ 逆順

In [24]: a[::-1]
Out[24]: [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

⑨ 5個目から逆順

In [25]: a[5::-1]
Out[25]: [5, 4, 3, 2, 1, 0]

⑩ 逆順のちがった表現

In [26]: a[-1::-1]
Out[26]: [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]




●3.スライスの仕組み


スライスの仕組みを紐解くと、実はオブジェクトということがわかりました。


slice
クラス


a[:] → a[slice(None,None,)]

とできるのです。

つまり start,stop,skip という順番で指定することができます。

a[1::2] 1個目から2つおきということを

a[slice(1,None,2)] で置き換えられます。

In [32]: a[slice(None,None,None)]
Out[32]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

引き数をすべてNoneにするとリスト全データということになります。

最初のNoneは0
次のNoneはLen(a)
最後のNoneは1

となります。










●スライスで間引き●

いかがだったでしょうか?もちろん、そんなこと基本だろ!とおしかりを受けそうな内容かもしれませんが、私はハマってしまい、ずいぶんと時間を費やしてしまいました。

a[::5] たったこれだけでリストの5個おきに間引きできるなんて・・・


pandasのデータフレームでも簡単です。また詳しく説明する記事を書きたいと思いますが、以下にてすぐに間引きできます。


fd=fd.ix[::mabiki]

※mabikiは変数です





チェック 間引きはスライスで簡単にできる
チェック a[::5] で5個置きに間引き
チェック a[slice[None,None,5)]でも可能。sliceクラスが正体
チェック 逆順の間引きも簡単 a[::-5]
チェック pandasのデータフレームでも同じようにできる fd=fd.ix[::mabiki]










Python ブログランキングへ 
クリックしてね



AD
コメント(0)  |  リブログ(0)

hitochan007さんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。