前回はここまで書きました:
まず下記のコードで簡単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 |
それじゃねー