【Python】【Pandas】DataFrameやSeriesでのループ処理
DataFrameやSeriesでは色々なループの方法がある。
同じような動作をする場合でも複数の方法があったりする。
Seriesのループ
Seriesのループには大きく分けて3種類のループがある。
- 値のみを取得するループ
- インデックスを取得するループ
- インデックスと値を取得するループ
値を取得するループ
Seriesでは特になにも指定せずにfor文を書くと、値が取得される。
値を取得したい場合はこれでOK。
1sr = pd.Series(data= [1, 2, 3, "a", "b", "c"], name="colA")
2
3for _d in sr:
4 print(_d)
5
6# 1
7# 2
8# 3
9# a
10# b
11# c
インデックスを取得するループ
インデックスを取得したい場合は、Series.indexでループを回せばOK。
1for idx in sr.index:
2 print(idx)
3
4# 0
5# 1
6# 2
7# 3
8# 4
9# 5
インデックスと値を取得するループ
インデックスと値をループさせる方法はいくつかある。
itemsを使う方法
dictなどでも使えるitems()を使うことでindexと値を取得できる。
1for i, v in sr.items():
2 print(i, v)
3
4# 0 1
5# 1 2
6# 2 3
7# 3 a
8# 4 b
9# 5 c
なお、DataFrameにもitemsがあるが、Seriesとは少し動作が違うので注意。
iteritemsを使う方法
1for i, v in sr.iteritems():
2 print(i, v)
3
4# 0 1
5# 1 2
6# 2 3
7# 3 a
8# 4 b
9# 5 c
動作はitemsと同じ。
itemsと同じくDataFrameにもiteritemsがあるが、こちらもSeriesとDataFrameでは動作が異なるので注意。
enumerateを使う方法
1for i, v in enumerate(sr):
2 print(i, v)
3
4# 0 1
5# 1 2
6# 2 3
7# 3 a
8# 4 b
9# 5 c
listとかでもよくやる方法。
DataFrameのループ
DataFrameは2次元のデータなので、Seriesに比べるとさせたいループの種類が多いが大きく分けて2種類に分かれる。
- 列方向のループ
- 行方向のループ
Seriesにもあるitems、iteritemsもあれば、DataFrameにしかないiterrowsなどもある。
列方向のループ
items, iteritemsを使う方法
Seriesにも存在したitemsはDataFrameだと列方向のループとなる。
列名とその列のSeriesが返ってくる。
1df = pd.DataFrame({"colA": [1, 2, 3, 4],
2 "colB": ["a", "b", "c", "d"],
3 "colC": [5, 6, "e", "f"]})
4
5
6# 列毎にループ
7for col, sr in df.items():
8 print(col, sr)
9
10# colA 0 1
11# 1 2
12# 2 3
13# 3 4
14# Name: colA, dtype: int64
15# colB 0 a
16# 1 b
17# 2 c
18# 3 d
19# Name: colB, dtype: object
20# colC 0 5
21# 1 6
22# 2 e
23# 3 f
24# Name: colC, dtype: object
各列をSeriesとして取得できるので、値やindexがあり、色々な操作がしやすいかもしれない。
DataFrameをそのままループする方法
DataFrameをそのままループさせると列名のループとなる。
1for col in df:
2 print(col)
3
4# colA
5# colB
6# colC
columnsを使わなくてもcolumnsでループさせた場合と同じ結果になるが、columnsを使った方が明示的で分かりやすい(かもしれない)。
columnsを使う方法
DataFrame.columnsでカラムを取得できるので、カラム名でループさせる方法。
1for col in df.columns:
2 print(col)
3
4# colA
5# colB
6# colC
カラム名指定で何か処理をしたい場合などに便利かもしれない。
行方向のループ
iterrowsを使う方法
インデックスとその行の列名と値をSeriesで取得できる。
Seriesのインデックスが列名となる。
1# 行毎にindexとカラム名、値をSeriesで取得
2for i, sr in df.iterrows():
3 print("■index: ", i)
4 print("Series: ", sr)
5
6# ■index: 0
7# Series: colA 1
8# colB a
9# colC 5
10# Name: 0, dtype: object
11# ■index: 1
12# Series: colA 2
13# colB b
14# colC 6
15# Name: 1, dtype: object
16# ■index: 2
17# Series: colA 3
18# colB c
19# colC e
20# Name: 2, dtype: object
21# ■index: 3
22# Series: colA 4
23# colB d
24# colC f
25# Name: 3, dtype: object
iterrowsは速度が非常に遅いので、行毎の処理でも、特定の列しか使わない等であれば、特定の列を最初に取り出してSeriesやndarrayとしてループさせた方が良いかもしれない。
indexを使う方法
columnsと同様にindexを使うと行方向にループできる。
1for idx in df.index:
2 print(idx)
3
4# 0
5# 1
6# 2
7# 3
行だけ取得して特定の列に何かの処理をしたい場合なのに便利かもしれない。
itertuplesを使う方法
itertuplesを使うと行毎にindexやカラム名、値をタプルで取得できる。
1for t in df.itertuples():
2 print(t)
3
4# Pandas(Index=0, colA=1, colB='a', colC=5)
5# Pandas(Index=1, colA=2, colB='b', colC=6)
6# Pandas(Index=2, colA=3, colB='c', colC='e')
7# Pandas(Index=3, colA=4, colB='d', colC='f')
まとめ
SeriesやDataFrameでindexやcolumns、enumerateを以外にもitemsやiterrowsなど色々な方法があるので、その場に合わせて適切な方法を選択できるようにしておくと良いかもしれない。