質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

DataFrameの条件に基づいてデータを抽出したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 310

umeeeeeeeeee

score 1

■概要
表の列1を参照して、列2のデータを取り出したい。
表は以下のような特徴があります。
・列1にはデータ番号が各2個ずつ若い順に並んでいる。
・カラムはなし。

列1 列2
1 10
1 8
4 12
4 14

■実現したいこと
取り出したいデータ番号の2番目の行の値を取り出したい。
(例)
データ番号1 → 8 
データ番号4 → 14

python初心者で、質問内容に不足があるかもしれませんが、
ご教授の方よろしくお願いいたします。

発生している問題・エラーメッセージ

int() argument must be a string, a bytes-like object or a number, not 'Int64Index'

該当のソースコード

import pandas as pd
import numpy as np
#データインポート
csv_input = pd.read_csv(file,encoding="cp932")
#取り出したいデータ番号指定
number = 4
#列1において、numberと同じ値の行のみを抽出
n = csv_input.iloc[:,2] == number
m = n[n == True]
#numberと同じ値の行の2個目をindexに格納
index = int(m.index[2:3])
#ほしいデータをdataに格納
data = csv_input.iat[index,1]

補足情報(FW/ツールのバージョンなど)

anaconda3
Python3.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2020/05/14 16:10

    エラー発生行は「index = int(m.index[2:3])」ですか?
    エラーメッセージはエラー発生行を含めて掲載してください。(出来ればエラーメッセージ全文)

    キャンセル

  • umeeeeeeeeee

    2020/05/14 16:19

    その通りです。
    ■エラーメッセージ
    index = int(m.index[2:3])
    TypeError: int() argument must be a string, a bytes-like object or a number, not 'Int64Index'

    これからは気を付けようと思います。
    ご指摘ありがとうございます。

    キャンセル

回答 2

checkベストアンサー

+1

多分やりたいことは

index = int(m.index[2:3])


の部分を

index = m.index[-1]


とすることで実現できると思います。

さらに書くとフィルタリング部(mを導いている行)はnからフィルタリングするのではなく、もとのデータフレームからフィルタリングすることで

n = csv_input.iloc[:,2] == number
m = n[n == True]
index = m.index[-1]
data = csv_input.iat[index,1]


の部分は

n = csv_input.iloc[:,2] == number
data = csv_input[n == True].iat[-1,1]


となります

さらに書くと、groupby().tail() を使うことで一括で対応する行を抜き出すこともできます。

https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.core.groupby.GroupBy.tail.html

import pandas as pd

df = pd.DataFrame({
    '列1':[1,1,2,2,3,3,4,4,5,5],
    '列2':[1,2,3,4,5,6,7,8,9,10]
})

ret = df.groupby('列1').tail(1)
print(ret)
#   列1  列2
#1   1   2
#3   2   4
#5   3   6
#7   4   8
#9   5  10

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/14 17:41

    回答ありがとうございます。

    無事解決できました。
    データ番号の数が3以上でも、好きな箇所を抽出できるので、勉強になりました。
    n,mのところは自分でも少しまどろっこしく感じていたので、大変助かります。
    groupbyは見たことがあったのですが、このような場面で使えるんですね。
    インプットだけではなく、アウトプットにも注力していこうと強く思いました。

    また機会がありましたら、回答の方よろしくお願いいたします。

    キャンセル

0

一括処理できます

import pandas as pd
df=pd.DataFrame([[1,10],[1,8],[4,12],[4,14],])
df[df.duplicated(subset=0)]


なぜこうなるかは調べてみてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/14 17:05

    回答ありがとうございます。
    "重複要素"として扱うことを全く考えていませんでした。
    重複要素の取り扱いについて学ぶことができました。

    また機会があれば、回答の方よろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る