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

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

ただいまの
回答率

87.95%

python pandas csvデータの抽出について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 419
退会済みユーザー

退会済みユーザー

pythonのpandasを使用し、元のdata.csvデータから値を抽出しlist.csvに出力したいと考えております。

data.csv[id,id2,cost]:[1,10,5][2,10,3][3,10,1][1,13,10][2,13,5][3,13,4]......

list.csv[id2,min]:[10, ][13, ]...

といった内容になっております。

data.csvのid2の値に対してcostが一つであれば、list.csvのminに入る値は一つに決まるのですが、data.csvのid2の値に対してcostが複数ある場合(今回は3つ)に、最小となるcostをlist.csvに出力するにはどのようにしたらよいでしょうか。

list.csvにおいてid2が10の時には1を、13の時には4を出力したいです。

なお、data.csvにおいてid2が1つである場合には、list.csvのminは1つに決まると思いますが、その時のスクリプトは以下になります。

import pandas as pd

df = pd.read_csv("data.csv")
df1 = pd.read_csv("list.csv")
new_file = "data_min.csv"
results = df.merge(df1,on="id2")
results.to_csv(new_file,index=False)

上記について教えていただけたらと思います。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

これで良いのではないでしょうか?

df1['min'] = df1['id2'].map(df.groupby('id2')['cost'].min())

少し説明を加えると

  1. df.groupby('id2')['cost'].min() にて df(data.csv)のデータフレームを id2の値ごとにcost列が最小の値を導く
  2. df1['id2'].map(...) にて上記の結果を df1(list.csv)のid2列の値で引き当てる
  3. 結果をdf1のmin列に格納する

を行っております。


動作サンプルコード

import pandas as pd
import io

data_csv = """
id,id2,cost
1,10,5
2,10,3
3,10,1
1,13,10
2,13,5
3,13,4
"""

df = pd.read_csv(io.StringIO(data_csv))
print(df)
#   id  id2  cost
#0   1   10     5
#1   2   10     3
#2   3   10     1
#3   1   13    10
#4   2   13     5
#5   3   13     4

conv = df.groupby('id2')['cost'].min()
print(conv)
#id2
#10    1
#13    4

list_csv = """
id2,min
10,
13,
"""
df1 = pd.read_csv(io.StringIO(list_csv))
print(df1)
#   id2  min
#0   10  NaN
#1   13  NaN

ret = df1['id2'].map(conv)
print(ret)
#0    1
#1    4
#Name: id2, dtype: int64

df1['min'] = ret
print(df1)
#   id2  min
#0   10    1
#1   13    4

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/12 13:24

    ご教授いただいた内容で動作いたしました。
    ありがとうございました。

    もう一点ご質問よろしいでしょうか。
    基本は上記同様にdata.csvのid2に着目してcostが最小の値をlist.csvのminに出力するのですが、今回新たにid2がminを取る時のdata.csvのid(1,2,3)にも着目したいと考えております。
    具体的には、同じ番号のidの最小値を取れる回数に制限を設け(id:1⇒2回、id2⇒2回、id3⇒1回まで)最小値を取るidが制限に達した場合、そのidはminを取る場合であっても、制限に達していないidのうちから最小値を選択するようにするにはどのように変更したらよいでしょうか。

    data.csv[id,id2,cost]:[1,10,5][2,10,3][3,10,1][1,13,10][2,13,5][3,13,4][1,18,1][2,18,5][3,18,10][1,20,10][2,20,5][3,20,4][1,25,10][2,25,1][3,25,5]......

    list.csv[id2,min]:[10, 1][13, 5][18,1][20,5][25,10]......
    のように出力したいです。
    id2が10の時は最小値が1なのでlist.csvのminには1が出力されます。
    (この時のidは3⇒制限回数1回に達したので最小値であってもidが3のものは以降使用できない)
    id2が13の時の最小値は4ですが、id3のものは使用できない為、2番目に小さい5をlist.csvのminに出力します。(この時のidは2)
    (最後の方になると、使用できるidの制限でmaxがlist.csvのminに出力されることもあり得ます。。。)
    このようにlist.csvの上から5列目までこの動作を繰り返すにはどのように変更したらよろしいでしょうか。
    なお、list.csvの6列目以降のminに関しては出力しなくて結構です。(id:1,2,3の制限の合計が5である為、6行目以降は全てのidが制限に達する為です。)

    お忙しいところ申し訳ございません。
    ご教授いただけましたら幸いです。
    よろしくお願いいたします。

    キャンセル

  • 2019/11/12 16:39

    ざっと上記仕様を見ました。
    簡単に実現できるのであれば回答しようかと思っておりましたが、残念ながら現状のコードを少し改変すると解決できるようなものではなく、全く違うアプローチを考える必要がありそのです。
    ですので大変申し訳有りませんが、これは別の質問として立てていただいた方がよいかと思います

    キャンセル

  • 2019/11/12 16:44

    全く違うアプローチが必要とのこと、承知いたしました。
    ご丁寧にご回答いただきありがとうございました。

    キャンセル

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

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

関連した質問

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