Pandas

【Python】【Pandas】DataFrameやSeriesでのループ処理

DataFrameやSeriesでは色々なループの方法がある。

同じような動作をする場合でも複数の方法があったりする。

Seriesのループ

Seriesのループには大きく分けて3種類のループがある。

①値のみを取得するループ

②インデックスを取得するループ

③インデックスと値を取得するループ

値を取得するループ

Seriesでは特になにも指定せずにfor文を書くと、値が取得される。

値を取得したい場合はこれでOK。

sr = pd.Series(data= [1, 2, 3, "a", "b", "c"], name="colA")

for _d in sr:
    print(_d)
>>
1
2
3
a
b
c

 

インデックスを取得するループ

インデックスを取得したい場合は、Series.indexでループを回せばOK。

for idx in sr.index:
    print(idx)
>>
0
1
2
3
4
5

 

インデックスと値を取得するループ

インデックスと値をループさせる方法はいくつかある。

itemsを使う方法

dictなどでも使えるitems()を使うことでindexと値を取得できる。

for i, v in sr.items():
    print(i, v)
>>
0 1
1 2
2 3
3 a
4 b
5 c

なお、DataFrameにもitemsがあるが、Seriesとは少し動作が違うので注意。

 

iteritemsを使う方法

for i, v in sr.iteritems():
    print(i, v)
>>
0 1
1 2
2 3
3 a
4 b
5 c

動作はitemsと同じ。

itemsと同じくDataFrameにもiteritemsがあるが、こちらもSeriesとDataFrameでは動作が異なるので注意。

 

enumerateを使う方法

for i, v in enumerate(sr):
    print(i, v)
>>
0 1
1 2
2 3
3 a
4 b
5 c

listとかでもよくやる方法。

 

DataFrameのループ

DataFrameは2次元のデータなので、Seriesに比べるとさせたいループの種類が多いが大きく分けて2種類に分かれる。

①列方向のループ

②行方向のループ

Seriesにもあるitems、iteritemsもあれば、DataFrameにしかないiterrowsなどもある。

列方向のループ

items, iteritemsを使う方法

Seriesにも存在したitemsはDataFrameだと列方向のループとなる。

列名とその列のSeriesが返ってくる。

df = pd.DataFrame({"colA": [1, 2, 3, 4],
                   "colB": ["a", "b", "c", "d"],
                  "colC": [5, 6,  "e", "f"]})


# 列毎にループ
for col, sr in df.items():
    print(col, sr)
>>
colA 0    1
1    2
2    3
3    4
Name: colA, dtype: int64
colB 0    a
1    b
2    c
3    d
Name: colB, dtype: object
colC 0    5
1    6
2    e
3    f
Name: colC, dtype: object

 

各列をSeriesとして取得できるので、値やindexがあり、色々な操作がしやすいかもしれない。

columnsを使う方法

DataFrame.columnsでカラムを取得できるので、カラム名でループさせる方法。

for col in df.columns:
    print(col)
>>
colA
colB
colC

カラム名指定で何か処理をしたい場合などに便利かもしれない。

行方向のループ

iterrowsを使う方法

インデックスとその行の列名と値をSeriesで取得できる。

Seriesのインデックスが列名となる。

# 行毎にindexとカラム名、値をSeriesで取得
for i, sr in df.iterrows():
    print("■index: ", i)
    print("Series: ", sr)
>>
■index:  0
Series:  colA    1
colB    a
colC    5
Name: 0, dtype: object
■index:  1
Series:  colA    2
colB    b
colC    6
Name: 1, dtype: object
■index:  2
Series:  colA    3
colB    c
colC    e
Name: 2, dtype: object
■index:  3
Series:  colA    4
colB    d
colC    f
Name: 3, dtype: object

 

iterrowsは速度が非常に遅いので、行毎の処理でも、特定の列しか使わない等であれば、特定の列を最初に取り出してSeriesやndarrayとしてループさせた方が良いかもしれない。

 

indexを使う方法

columnsと同様にindexを使うと行方向にループできる。

for idx in df.index:
    print(idx)
>>
0
1
2
3

行だけ取得して特定の列に何かの処理をしたい場合なのに便利かもしれない。

 

itertuplesを使う方法

itertuplesを使うと行毎にindexやカラム名、値をタプルで取得できる。

for t in df.itertuples():
    print(t)
>>
Pandas(Index=0, colA=1, colB='a', colC=5)
Pandas(Index=1, colA=2, colB='b', colC=6)
Pandas(Index=2, colA=3, colB='c', colC='e')
Pandas(Index=3, colA=4, colB='d', colC='f')

 

 

まとめ

SeriesやDataFrameでindexやcolumns、enumerateを以外にもitemsやiterrowsなど色々な方法があるので、その場に合わせて適切な方法を選択できるようにしておくと良いかもしれない。