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

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

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

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

Q&A

解決済

2回答

601閲覧

データフレームのif文の使い方 (複数行の条件)

___kk___

総合スコア2

Python 3.x

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

0グッド

0クリップ

投稿2021/09/17 22:00

編集2021/09/18 00:54

下記のようなデータフレームがあります.timeは時間:分:秒です.

timecharacter
100:02:56Cobb
200:03:22Saito
300:05:12Saito
400:05:50Mal
500:06:03Arthur
600:06:37Mal
700:08:21Cobb
800:08:41Mal

time列の値から60秒以内のとき,character列の内容を結合して表示させるループを作成したいと考えております.

例えば,time列1行目の00:02:56から2行目の00:03:22は60秒以内なのでCobb-Saitoと表示させ,2行目の00:03:22から3行目の00:05:12は60秒以上なので表示させないといったものです.
また,3行目の00:05:12から5行目の00:06:03も同様に60秒以内なので表示させたいので,前後のラインでの比較ではないと考えております.

[理想の結果]
Cobb-Saito #1行目と2行目
Saito-Mal #3行目と4行目
Saito-Arthur #3行目と5行目
Mal-Arthur #4行目と5行目
Mal-Mal #4行目と6行目
Arthur-Mal #5行目と6行目
Cobb-Mal #7行目と8行目

ご教授いただけますでしょうか?
何卒よろしくお願いいたします。

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

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

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

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

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

meg_

2021/09/18 01:22

> また,3行目の00:05:12から5行目の00:06:03も同様に60秒以内なので表示させたいので,前後のラインでの比較ではないと考えております. ではどういうロジックですか?
can110

2021/09/18 01:27

現状までのコード、あるいはどのような処理を行えばよいのかという基本的な考え、流れを記載ください。 そのうえで、どこ(何)が分からないのかを記載ください。
ppaul

2021/09/18 01:48

timeは文字列ですか、それともdatetime.timeですか?
guest

回答2

0

timeの形式が、文字列なのか、datetime.timeなのかがわからないので、datetime.timeだと仮定しました。
文字列の場合はもう少し簡単になります。
datetime.timeは加減算ができないのでdatetime.timedeltaに変更しています。

python

1>>> print(df) 2 time character 31 00:02:56 Cobb 42 00:03:22 Saito 53 00:05:12 Saito 64 00:05:50 Mal 75 00:06:03 Arthur 86 00:06:37 Mal 97 00:08:21 Cobb 108 00:08:41 Mal 11>>> 12>>> import datetime 13>>> 14>>> now = datetime.datetime.now() 15>>> today = datetime.datetime.combine(now, datetime.time(0)) 16>>> df['time'] = df['time'].apply(lambda x: datetime.datetime.combine(now, x) - today) 17>>> 18>>> def near(df, i, distance = datetime.timedelta(seconds=60)): 19... df_result = df[df['time']-df.iloc[i]['time']<=distance].iloc[i+1:] 20... df_result['base_time'] = df.iloc[i]['time'] 21... df_result['base_character'] = df.iloc[i]['character'] 22... return df_result 23... 24>>> df_near = pd.concat([near(df, i) for i in range(len(df))]) 25>>> 26>>> df_near['near_character'] = df_near['base_character'] + '-' + df_near['character'] 27>>> 28>>> print(df_near) 29 time character base_time base_character near_character 302 0 days 00:03:22 Saito 0 days 00:02:56 Cobb Cobb-Saito 314 0 days 00:05:50 Mal 0 days 00:05:12 Saito Saito-Mal 325 0 days 00:06:03 Arthur 0 days 00:05:12 Saito Saito-Arthur 335 0 days 00:06:03 Arthur 0 days 00:05:50 Mal Mal-Arthur 346 0 days 00:06:37 Mal 0 days 00:05:50 Mal Mal-Mal 356 0 days 00:06:37 Mal 0 days 00:06:03 Arthur Arthur-Mal 368 0 days 00:08:41 Mal 0 days 00:08:21 Cobb Cobb-Mal

必要に応じて df_near['near_character'] を取り出して使ってください。

投稿2021/09/18 03:35

ppaul

総合スコア24670

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

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

0

ベストアンサー

60秒以上なので表示させない
60秒以内なので表示させたい

60秒がどちらかわかりませんね。60秒未満は表示させるにします。

Python

1import pandas as pd 2import datetime 3 4df = pd.read_csv('data.csv') 5print(df) 6""" 7 time character 80 00:02:56 Cobb 91 00:03:22 Saito 102 00:05:12 Saito 113 00:05:50 Mal 124 00:06:03 Arthur 135 00:06:37 Mal 146 00:08:21 Cobb 157 00:08:41 Mal 16""" 17 18df['time'] = pd.to_datetime(df['time']) 19df.set_index('time', inplace=True) 20ans = list() 21td = datetime.timedelta(seconds=60) 22for i in range(len(df.index)-1): 23 start = str(df.index[i]).split()[1] 24 end = str(df.index[i]+td).split()[1] 25 lst = df.between_time(start, end, include_end=False)['character'].values.tolist() 26 ans.append([lst[0]+'-'+name for i, name in enumerate(lst) if i > 0]) 27 28ans = sum(ans, []) 29print(*ans, sep='\n') 30""" 31Cobb-Saito 32Saito-Mal 33Saito-Arthur 34Mal-Arthur 35Mal-Mal 36Arthur-Mal 37Cobb-Mal 38"""

投稿2021/09/18 02:04

lehshell

総合スコア1156

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問