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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1364閲覧

マッチングリストの名前とデータフレーム内の担当名が一致した場合にチーム番号を返したい

LumpurKuala

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/09/26 15:02

編集2020/09/27 01:18

前提・実現したいこと

マッチングリストと一致する主担当とデータフレーム内の担当が一致した場合に
チーム番号を返したい

◆背景
とある企業の担当リストを抽出し以下の通り複数加工ました。
⓵ dataframe           2つ
⓶ マッチングリスト リスト型   1つ   


◆DF名 : tantou_df1['202002020201']
![イメージ説明
◆DF名 : tantou_df1['202002020202']
イメージ説明

以下のマッチングリストと上記DF内の主担当名が一致する場合
チーム番号を抽出したいです

マッチングリスト
イメージ説明

例)抽出した対象のチーム番号を取得しデータフレーム化する。 
丹内  1 , 11
国分恭 5 , 9

非常に稚拙な質問となってしまい、意図が正しく伝わっているかどうかわかりませんが
ご教示いただければ助かります。

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

⓵ dataframe内を検索するfor文を作成し 1レコードづつマッチングファイルの各DFファイルの主担当とぶつける
⓶ 一致した場合はそのチーム番号を取得し別変数へ退避させ、次のファイル内を探す
⓷⓵~⓶の要領でマッチングリストの中の全担当を全て調べる

Onedict = {} g = 0 i = 0 for tantou_id in tantou_id_list: for g in range(27) if tantou_df1[tantou_id].iloc[g,1] == OneList[j]: Onedict[g] = race_df2[tantou_id].iloc[g,0] g += 1        break; else: g += 1 へ

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

google colaboratory を使用

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/09/26 15:13

コードは「コードの挿入」で記入してください。
hana_yama_san

2020/09/26 15:16

競馬の話って別のアナロジーに 転換出来ませんか? 問題文のままだと不気味なオーラを感じてしまう。
LumpurKuala

2020/09/26 15:30

承知しました。いったん修正させていただきます。
hana_yama_san

2020/09/26 15:35

お手数かけて申し訳ないです、
meg_

2020/09/27 01:27

> 以下のマッチングリストと上記DF内の主担当名が一致する場合 「データフレーム1にも存在していて、データフレーム2にも存在していて、かつマッチングリストにも存在している人物とそのチーム番号を抽出したい」ということですか?
meg_

2020/09/27 02:59

> 例)抽出した対象のチーム番号を取得しデータフレーム化する。  > 丹内  1 , 11 > 国分恭 5 , 9 大野と黛が除外されている理由は何でしょうか?
LumpurKuala

2020/09/27 02:59

meg様 お察しの通りです。 解釈がまっすぐ伝わらない文面となり申し訳ございません。
guest

回答2

0

ベストアンサー

Python

1#df1,df2,matching_listは質問文の様に定義済とする 2 3df3 = pd.merge(df1, df2, on='主担当') 4df3 = df3.drop(['副担当_x','副担当_y'], axis=1) 5df3['チーム番号'] = df3['チーム番号_x'].astype(str) + ',' + df3['チーム番号_y'].astype(str) 6df3 = df3.drop(['チーム番号_x','チーム番号_y'], axis=1) 7answer_list = [i for i in df3['主担当'] if i in matching_list] 8df3 = df3[df3['主担当'].isin(answer_list)] 9print(df3) 10#主担当 チーム番号 11#0 丹内 1,11 12#1 大野 3,8 13#2 黛 4,5 14#3 国分恭 5,9

投稿2020/09/27 03:08

編集2020/09/27 04:29
meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/09/27 04:13

すばらしい! アラ探しになりすみませんが、2箇所コピーミスあります。 (df33になっているところ、最後のprint文)
meg_

2020/09/27 04:31

ご指摘ありがとうございます。全く気が付きませんでした。 実務では大きなデータを扱うため、pandasでのループ処理は出来るだけ避けるようにしています。
LumpurKuala

2020/09/29 14:26

meg_様 この度はコーディングをご教示いただきありがとうございました。 まさに自分が求めていた回答でした。 やはり、toast-uzさん然り、ここに集まる人は尋常じゃない人しかいないのですね。 もう少しまともに質問できるようになります。 改めてご回答いただきありがとうございました。
guest

0

とりあえず目的の動作をするコードを作ってみました。もっと洗練された回答があるかもしれませんが。。。

Python

1import pandas as pd 2 3# DataFrameは簡略化のため一部のみ作っています 4tantou_df1 = {} 5tantou_df1['202002020201'] = pd.DataFrame([ 6 [1, '丹内', '高橋'], 7 [2, '菱田', '中野'], 8 [3, '大野', '松下'], 9 [5, '国分恭', '森田']], 10 columns=['チーム番号', '主担当', '副担当']) 11tantou_df1['202002020202'] = pd.DataFrame([ 12 [1, '藤岡', '林'], 13 [2, '秋山', '加藤'], 14 [3, '横山', '大竹'], 15 [10, '国分恭', '森田'], 16 [12, '丹内', '相沢']], 17 columns=['チーム番号', '主担当', '副担当']) 18matching_list = ['丹内', '武', '国分恭'] # 確認のため、存在しない主担当も入れる 19 20result_list = [] 21for name in matching_list: 22 # それぞれの担務から主担当に一致するチーム番号のリストを抽出する 23 match_tantou1 = tantou_df1['202002020201'][tantou_df1['202002020201']['主担当'] == name]['チーム番号'].values 24 match_tantou2 = tantou_df1['202002020202'][tantou_df1['202002020202']['主担当'] == name]['チーム番号'].values 25 # ひとりの主担当が1つの担務に2回以上出現したら例外としてストップ 26 assert len(match_tantou1) <= 1 and len(match_tantou2) <= 1 27 # 主担当の担務記録を追加 28 matching = [name] 29 matching.extend(match_tantou1) 30 matching.extend(match_tantou2) 31 result_list.append(matching) 32 33# 結果をDataFrameに変換 34result_df = pd.DataFrame(result_list) 35print(result_df)

出力結果

0 1 2 0 丹内 1.0 12.0 1 武 NaN NaN 2 国分恭 5.0 10.0

投稿2020/09/27 01:30

編集2020/09/27 02:56
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LumpurKuala

2020/09/29 14:23

toast-uz 様 ご返信遅くなりまして申し訳ございません。 この度は初心者にもわかりやすくDF作成からご解説いただきましてありがとうございました。 ベストアンサーについてはやりたかったロジックにピンポイントだったため恵様へつけさせていただきましたが、toast-uz様の回答は初心者に寄り添うもので仏様のような温かみを感じました。 今後もpythonに励む中で答えやすい質問を心がけます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問