質問するログイン新規登録
Python

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

Q&A

解決済

1回答

702閲覧

python データフレームからの抽出方法

goma-goma

総合スコア39

Python

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

0グッド

0クリップ

投稿2020/01/15 18:53

編集2020/01/15 18:56

0

0

写真のようなDataFrameがある場合に、
以下の①~③のようなデータを抽出する方法を教えていただきたいです。
初歩的な内容かとは思いますが、何卒よろしくお願いします。

①最も古いtimestampの値
└写真のDataFrameのオレンジ色箇所に該当
②DataFrame内の最新のtimestampがindexになっているdata
└写真のDataFrameの緑色箇所に該当
③flag列において最新でflagが1になっているtimestamp
(ただし探索範囲は最新の時間から60秒前まで)
└写真のDataFrameの水色箇所に該当

※1:写真のDataFrameでいうと、最も古い=0:00:00
※2:写真のDataFrameでいうと、最新  =0:02:10
※3:timestampがindexに指定されている

↓DataFrame
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際のコードで説明しますと、こんな感じになります。

Python

1import pandas as pd 2 3df = pd.DataFrame({'timestamp':['0:00:00', '0:00:10', '0:00:20', 4 '0:00:30', '0:00:40', '0:00:50', 5 '0:01:00', '0:01:10', '0:01:20', 6 '0:01:30', '0:01:40', '0:01:50', 7 '0:02:00', '0:02:10'], 8 'data':[37,98,75,19,24,70,83,14,44,66,61,87,36,50], 9 'flag':[0,0,0,0,0,0,0,0,0,1,0,0,0,0]}) 10 11# timestamp列はtimedelta型(またはdatetime型)にしておく 12df['timestamp'] = pd.to_timedelta(df['timestamp']) 13# timestamp data flag 14#0 00:00:00 37 0 15#1 00:00:10 98 0 16#2 00:00:20 75 0 17#3 00:00:30 19 0 18#4 00:00:40 24 0 19#5 00:00:50 70 0 20#6 00:01:00 83 0 21#7 00:01:10 14 0 22#8 00:01:20 44 0 23#9 00:01:30 66 1 24#10 00:01:40 61 0 25#11 00:01:50 87 0 26#12 00:02:00 36 0 27#13 00:02:10 50 0 28 29### (1) 最も古いtimestampの値 ### 30# timestamp列の最小値を取得 31print(df['timestamp'].min()) 32# 0 days 00:00:00 33 34 35### (2) DataFrame内の最新のtimestampがindexになっているdata ### 36 37# timestamp列が最大値を取るindexを取得 38target_index = df['timestamp'].idxmax() 39# target_index行の data列を取得(.at()か .loc()を使う) 40print(df.at[target_index, 'data']) 41# 50 42 43# (補足)通常は上記を纒めて以下のように書くことが多い 44print(df.loc[df['timestamp'].idxmax(), 'data']) 45# 50 46 47 48### (3) flag列において最新でflagが1になっているtimestamp ### 49### (ただし探索範囲は最新の時間から60秒前まで) ### 50 51# 最新のtimestampを求める 52current = df['timestamp'].max() 53# 最新の時間から60秒前までの列かどうかのBoolianリストを求める 54filter_list1 = (df['timestamp'] >= (current - pd.Timedelta(60, unit='s'))) 55# 更にflagが1の列かどうかのBoolianリストを求める 56filter_list2 = (df['flag']==1) 57# 上記2つの条件のANDで新しいfilter_listを作成 58filter_list = (filter_list1 & filter_list2) 59#上記の条件に合致した行の timestamp列を取得(.loc()を使う) 60print(df.loc[filter_list, 'timestamp']) 61#9 00:01:30 62#Name: timestamp, dtype: timedelta64[ns] 63 64# (補足)上記を纒めると以下のようにかける 65print(df.loc[(df['timestamp'] >= (df['timestamp'].max()-pd.Timedelta(60, unit='s'))) & (df['flag']==1), 'timestamp']) 66#9 00:01:30 67#Name: timestamp, dtype: timedelta64[ns]

投稿2020/01/15 23:52

編集2020/01/16 02:46
magichan

総合スコア15898

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

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

goma-goma

2020/01/16 03:00

ありがとうございます!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問