LoginSignup
7
11

More than 3 years have passed since last update.

Pandas 列名×行番号で要素を抽出する

Posted at

はじめに

loc,ilocなど、行名/列名,行番号/列番号を基に要素抽出は出てくるものの、
列名×行番号による抽出方法が上手く探せなかったため、メモ投稿です。

やりたかったこと

大元のデータフレーム(列名有り,行名無し)から、特定の要素を持つグループに分け、
各データフレームに対して1行ずつ参照して処理をしていく必要があった。

その際、列の指定は出来るが行の指定が思うようにできないため、行番号で処理を試みた。
(reset_indexも考えたが、きっと列名×行番号での指定も出来るはず…)

結論

atとindexを組み合わせ、df.at[df.index[行番号],'列名'] で抽出できる

(↓の記事をきちんと読めば良かった...)
https://note.nkmk.me/python-pandas-at-iat-loc-iloc/

お試し

DataFrame
# 列名のみのデータフレーム作成
df = pd.DataFrame({'person':['a','b','c','a','b','c'],\
                  'name':['aa','bb','cc','aaa','bbb','ccc'],\
                  'num':[100,200,300,1000,2000,3000]})

    person  name    num
0   a   aa  100
1   b   bb  200
2   c   cc  300
3   a   aaa 1000
4   b   bbb 2000
5   c   ccc 3000

単純に、大元のdfから"name"列 0行目 (=aa) を抽出するにはどちらでも可能

person_0
df['name'][0]
# 抽出した行に(大元の)index=0があるため抽出可能
# aa

df.at[df.index[0],'name']
# aa

今度は"person"列が同じ人に絞り、その上で0行目を取得してみる
 ※今回の話とはずれますが、行列を絞る際や要素抽出時に
  "SettingWithCopyWarning"にハマらないよう注意(ハマりました。。)
  https://linus-mk.hatenablog.com/entry/2019/02/02/200000
  https://qiita.com/HEM_SP/items/56cd62a1c000d342bd70

person_a_0
# "person"列がaの行に絞る
df_a = df[df['person']=="a"]
df_a
    person  name    num
0   a   aa  100
3   a   aaa 1000

df_a['name'][0]
# 抽出した行に(大元の)index=0があるため抽出可能
# aa

df_a.at[df_a.index[0],'name']
# aa
person_b_0
# "person"列がbの行に絞る
df_b = df[df['person']=="b"]
df_b
    person  name    num
1   b   bb  200
4   b   bbb 2000

df_b['name'][0]
# 抽出した行にindex=0がないためエラー

df_b.at[df_b.index[0],'name']
# bb

atを使うことで、どのデータフレームに対しても行番号で要素を抽出出来た。

終わりに

少しでも、見つからずに困っている方の役に立てば嬉しいです。

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11