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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1928閲覧

別のデータフレームから条件に合う行を検索し、該当する場合に特定の値を抽出したいです。

daison283

総合スコア13

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/11/06 03:42

前提・実現したいこと

別のデータフレームから条件に合う行を検索し、該当する場合に特定の値を抽出したいです。

インプット
<データフレーム1>
index 局コード 日付 time 番組コード
1 1 4/1 1132 N/A
2 3 4/3 1135 N/A
3 3 4/4 1221 N/A

<データフレーム2>
index 局コード 日付 開始時間 終了時間 番組コード 
1 1 4/1 1130 1255 ABC1
2 2 4/1 1130 1256 BBC2
3 3 4/3 1045 1150 CBC3
4 1 4/5 930 955 AAA1

期待する結果
<データフレーム1>
index 局コード 日付 time 番組コード
1 1 4/1 1132 ABC1
2 3 4/3 1135 CBC3
3 3 4/4 1221 N/A

条件としては、双方の'局コード','日付'が一致し、且つデータフレーム1の'time'が
データフレーム2の'開始時間'と'終了時間'の間の値であったときのみ、番組コードを抽出し、データフレーム1の番組コードに代入する。というものを書きたいです。
pythonをはじめたばかりで、書籍で学習しながらも学業の一環でこのような高度な条件設定の記述を用意せねばならず四苦八苦しています。お力添えいただければと思い質問させていただきました。

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

エラーメッセージ

該当のソースコード

import pandas as pd

mask =(pd.concat([データフレーム1,データフレーム2]).duplicated(subset=['局コード','放送日'], keep=False))
mask

python3, jupyter

試したこと

局コードと放送日が一致する条件の時、concatで結合するという条件まではかけたのですが、timeと開始時間、終了時間の不等号による条件設定ができません。また、現状のconcatではindexが同じ番号のもののみを比較し、trueかfalseかを判別してしまっているのですが、データフレーム1のindex1の条件に該当する行をデータフレーム2全体からサーチし、index最終段まで同様の施行を繰り返すということを実現させたいです。どうかお力添えをお願いいたします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえずループでの処理で良ければ、以下のように複数の条件文を連ねることで実現できます。

Python

1import pandas as pd 2import numpy as np 3 4df1 = pd.DataFrame({ 5 '局コード':[1,3,3], 6 '日付':['4/1','4/3','4/4'], 7 'time':[1132,1135,1221], 8 '番組コード':[np.nan,np.nan,np.nan] 9 }) 10 11df2 = pd.DataFrame({ 12 '局コード':[1,2,3,1], 13 '日付':['4/1','4/1','4/3','4/5'], 14 '開始時間':[1130,1130,1045,930], 15 '終了時間':[1255,1256,1150,955], 16 '番組コード':['ABC1','BBC2','CBC3','AAA1'] 17 }) 18 19for idx,row in df1.iterrows(): 20 res = df2[(df2['局コード'] == row['局コード']) & 21 (df2['日付'] == row['日付']) & 22 (df2['開始時間'] <= row['time']) & 23 (df2['終了時間'] >= row['time'])] 24 if not res.empty: 25 df1.loc[idx, '番組コード'] = res.iloc[0]['番組コード'] 26print(df1) 27# time 局コード 日付 番組コード 28#0 1132 1 4/1 ABC1 29#1 1135 3 4/3 CBC3 30#2 1221 3 4/4 NaN

投稿2018/11/06 04:55

magichan

総合スコア15898

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

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

daison283

2018/11/06 05:32

magichanさん 迅速な回答ありがとうございます。for構文でのループ試行とは、灯台下暗しでした。実データに当てはめて実行したところ、うまく稼働しました。本当に、本当にありがとうございます。ひきつづき勉強してゆきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問