91408

[code]

    import pandas as pd
    import numpy as np
    df1 = pd.DataFrame({'生物':['しろくま','ねこ','うさぎ','ラッコ','モモンガ','シーサー','オデ','鎧'],
                  'HP':[2,50,100,600,60,72,1000,np.nan]})
    df1
    
[/code]

上記のようなdf1から「うさぎ」の「HP」の100という値だけ取得したい場合、感覚的には

[code]

    # 行を指定せずに値を取得しようするとSeriesが取得されてしまう。
    a = df1[df1['生物'] =='うさぎ'].loc[:, 'HP']
    a
    
[/code]

こんな感じで「生物」列から「うさぎ」で1行に絞り込んだ値からHP列だけ取り出せば良いように感じるのですが、実際にはSeriesが取得されてしまいます。  
値だけを取得したい場合は、以下のように行のインデックスを指定する形にしないと100という値だけを取り出せないですよね。

[code]

    b = df1[df1['生物'] =='うさぎ'].iloc[0,1]
    b
    
[/code]

ルールは分かったのですが、a に代入した値がSeriesになってしまう理由がいまいち納得できません。どうしてなのか、ヒントをいただけないでしょうか。


CC BY-SA 4.0
2022-10-02T23:54:01.237
91406
2022-10-03T02:05:24.077
2022-10-03T02:05:24.077
3060
54631
question
python pandas
PandasのDataFrameのデータの抽出について（Seriesが返されるケースと値が取得できるケースの違い）


こんな記事が参考になるでしょう。  
[【Python】Pandas loc と ilocの違いとは？
初心者向けにわかりやすく解説](https://aiacademy.jp/media/?p=1551)  
[【Python】Pandasメモ：ilocとlocの違い、データの抽出方法](https://kojimanotech.com/2019/08/08/174/)

質問のソースコードに書いてある通り、locやilocの行部分パラメータの指定方法による違いでしょう。

`iloc`でも`[:,1]`と書けばSeriesが返りますし、`loc`で`[2,
'HP']`(`2`は`うさぎ`のIndex値)と書けば一つの値になります。

@metropolis さんのコメントにあるように、`df1.loc[df1['生物'] =='うさぎ',
'HP'].values[0]`とか、あるいは`df1[df1['生物']
=='うさぎ'].values[0][1]`という風に`values`と配列のIndexを使うという手もあります。


CC BY-SA 4.0
2022-10-03T01:30:13.470
91408
2022-10-03T01:39:05.657
2022-10-03T01:39:05.657
26370
26370
91406
answer