こんなことがあった。
以下のようなデータフレームで、横方向にデータを取得したい場面があった。
Excelなどの表の見た目や扱いに慣れていると、至極どうってことない気がするが、
pandasでやろうとした際に、一瞬迷ったのでメモしておく。
1 2 3 4 |
Group A B C D E 0 a 1 4 7 10 13 ⇦ A~Eの値をリストで取得したい 1 b 2 5 8 11 14 2 c 3 6 9 12 15 |
実際には横方向にもっと長いが、
やりたいこととしては、Group:’a’ のカラムA~E
の値を、リストに取得したい。
模索した結果、以下の方法で実現できた。
・.loc[:, :].values.tolist()
・transpose (.T)
(DFの縦横を入れ替える)
※「.T」はtranspose()の省略で、どっちでも同じく機能します。
※他にも良い方法はあると思います。
Example
①
の場合.loc[:, :].values.tolist()
1 2 3 4 |
cols = ['A', 'B', 'C', 'D', 'E'] row_a = df[df['Group'] == 'a'] # まず値を取得する行データを取り出す values_list = row_a.loc[:, cols].values.tolist() print(values_list[0]) |
出力結果
[1, 4, 7, 10, 13]
今回は紹介を省くが、
上記の書き方をさらに工夫して、さらにコード行を減らすこともできる。
②transpose (.T)
(DFの縦横を入れ替える)
1 2 |
# 縦横を入れ替えたデータフレームを作成 transposed_df = df.T # df.transpose()と同等 |
transpose後は、データフレームが以下のように縦横入れ替わっている。
0 1 2
Group a b c
A 1 2 3
B 4 5 6
C 7 8 9
D 10 11 12
E 13 14 15
Group:’a’ をリストに取り出してみる。
ここではあえて、「list」で取り出す。
1 |
print(list(transposed_df[0][1:])) |
出力結果
[1, 4, 7, 10, 13]
①の方法と同じ結果が取得できている。
しかし、②の方法は、「インタラクティブ実行」(jupyterlab)などでの使用が向いているかもしれない。
縦横を入れ替えるため、カラム名がindexになるし、慣れが必要かも。
まとめると
・「特定行の、特定列の値をリストで取り出す」というのが、意外とややこしかったが
慣れてしまえば、とてもシンプルに行うことができる。
・transposeは、.locに比べて少しだけ面倒かもしれないが、インタラクティブな環境であれば直感的であると感じた。