はじめに
loc,ilocなど、行名/列名,行番号/列番号を基に要素抽出は出てくるものの、
列名×行番号による抽出方法が上手く探せなかったため、メモ投稿です。
やりたかったこと
大元のデータフレーム(列名有り,行名無し)から、特定の要素を持つグループに分け、
各データフレームに対して1行ずつ参照して処理をしていく必要があった。
その際、列の指定は出来るが行の指定が思うようにできないため、行番号で処理を試みた。
(reset_indexも考えたが、きっと列名×行番号での指定も出来るはず…)
結論
atとindexを組み合わせ、df.at[df.index[行番号],'列名'] で抽出できる
(↓の記事をきちんと読めば良かった...)
https://note.nkmk.me/python-pandas-at-iat-loc-iloc/
お試し
# 列名のみのデータフレーム作成
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) を抽出するにはどちらでも可能
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の行に絞る
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の行に絞る
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を使うことで、どのデータフレームに対しても行番号で要素を抽出出来た。
終わりに
少しでも、見つからずに困っている方の役に立てば嬉しいです。