pandas#Data Framesの2

前回はここまで書きました:

pandas#Series

pandas#Data Framesの1


まず下記のコードで簡単DataFrameを作って見ます。乱数で5x4のTableを作り、RowsのIndexはABCDEでColumnsはWXYZ。

import pandas as pd
import numpy as np
from numpy.rand import randn

np.random.seed(seed=101)

df=pd.DataFrame(randn(5,4),
['A','B','C','D','E'],
['W','X','Y','Z']
)

Conditional Selection

やり方はnumpyと似ています。

df>0

これは実際jupyterで出力されたTableです。Boolean値のDataFramesが戻りました。
Trueは相当するCellが0より大き、Falseは相当するCellが0より小さい。

W X Y Z
A True False True True
B False False True True
C False False True False
D False True False True
E False False False True

もしこのBoolean値のDataFrameを元のDataFrameに参照したらどうになる?

bdf= df>0
df[bdf]

これは実際jupyterで出力されたTableです。数値があるところは0より大きく、NaNが入ってるところは0より小さいです。

W X Y Z
A 0.221491 NaN 1.541990 0.666319
B NaN NaN 1.407338 0.641806
C NaN NaN 1.028293 NaN
D NaN 0.720788 NaN 1.606780
E NaN NaN NaN 0.041460

こっちは直接条件と組みます。

df[df>0]

これは実際jupyterで出力されたTableです。結果は同じです。

W X Y Z
A 0.221491 NaN 1.541990 0.666319
B NaN NaN 1.407338 0.641806
C NaN NaN 1.028293 NaN
D NaN 0.720788 NaN 1.606780
E NaN NaN NaN 0.041460

もしColumnだけ比べたいなら、直接Keyをいれ、条件つければOK。Seriesが戻ります。

df['W']>0

A     True
B    False
C    False
D    False
E    False
Name: W, dtype: bool

今度はColumnのValueをFilterしてみます。Column”Y”が0より大きなところだけ取ります。

df[df['Y']>0]

これは実際jupyterで出力されたTableです。Row”D”とRow”E”のColumn”Y”が0より小さいなので表示しません。

W X Y Z
A 0.221491 -0.855196 1.541990 0.666319
B -0.538235 -0.568581 1.407338 0.641806
C -0.905100 -0.391157 1.028293 -1.972605

今度はさらにColumnを取ります。例えば…Column”Y”が0より大きなRowsを取ったあと、さらにZColumnだけ取ります。Seriesが戻ります。

df[df['Y']>0]['Z']

A    0.666319
B    0.641806
C   -1.972605
Name: Z, dtype: float64

もし複数を取るなら?今度は今度はさらにColumnを取ります。例えば…Column”Y”が0より大きなRowsを取ったあと、さらにZColumnとYColumnを取ります。

df[df['Y']>0][['Z','Y']]

これは実際jupyterで出力されたTableです。DataFrameが戻りました。

Z Y
A 0.666319 1.541990
B 0.641806 1.407338
C -1.972605 1.028293

Logicを使ってみます。Pythonのand operatorをそのまま使うと…

df[(df['Y']>0) and (df['Z']>0)]

こうするとエラーが出てきます。

--------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-81-e3904cb7f26d> in <module>()
----> 1 df[(df['Y']>0) and (df['Z']>0)]
...
....
.....
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

原因はPythonのand operatorがSeriesのBoolean”列”を処理することができません。処理できるのは単体のBooleanだけです。例えば:

True and True
True or False

正確な使え方はandではなく&を使います。

df[(df['Y']>0) & (df['Z']>0)]

これは実際jupyterで出力されたTableです。YColumnが0より大きなおかつZColumnが0より大きなDataFrameが戻りました。

W X Y Z
A 0.221491 -0.855196 1.541990 0.666319
B -0.538235 -0.568581 1.407338 0.641806

Indexをリセットしてみます。

df.reset_index()

これは実際jupyterで出力されたTableです。IndexというColumnが追加され、Indexが数字の0123になりました。

index W X Y Z
0 A 0.221491 -0.855196 1.541990 0.666319
1 B -0.538235 -0.568581 1.407338 0.641806
2 C -0.905100 -0.391157 1.028293 -1.972605
3 D -0.866885 0.720788 -1.223082 1.606780
4 E -1.115710 -1.385379 -1.329660 0.041460

Columnsを追加してみます。

newCol='new1 new2 new3 new4 new5'.split()
df['new']=newCol

これは実際jupyterで出力されたTableです。新しいColumnが追加されました。

W X Y Z new
A 0.221491 -0.855196 1.541990 0.666319 new1
B -0.538235 -0.568581 1.407338 0.641806 new2
C -0.905100 -0.391157 1.028293 -1.972605 new3
D -0.866885 0.720788 -1.223082 1.606780 new4
E -1.115710 -1.385379 -1.329660 0.041460 new5

最後はColumnをIndexに変わります。

df.set_index('new')

これは実際jupyterで出力されたTableです。IndexがColumn”new”になりました。

W X Y Z
new
new1 0.221491 -0.855196 1.541990 0.666319
new2 -0.538235 -0.568581 1.407338 0.641806
new3 -0.905100 -0.391157 1.028293 -1.972605
new4 -0.866885 0.720788 -1.223082 1.606780
new5 -1.115710 -1.385379 -1.329660 0.041460


それじゃねー

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする