2017-06-27 2 views
2

に基づいて重複:私は今、やりたい何パンダデータフレーム:私はこのようになります(非常にここでsimplyfied)パンダのデータフレーム持っている列と時間帯

df

datetime    user type msg 
0 2012-11-11 15:41:08 u1  txt hello world 
1 2012-11-11 15:41:11 u2  txt hello world 
2 2012-11-21 17:00:08 u3  txt hello world 
3 2012-11-22 18:08:35 u4  txt  hello you 
4 2012-11-22 18:08:37 u5  txt  hello you 

を取得することですすべてタイムスタンプが3秒以内のメッセージが重複しています。所望の出力は次のようになります第三の行せず

datetime    user type msg 
0 2012-11-11 15:41:08 u1  txt hello world 
1 2012-11-11 15:41:11 u2  txt hello world 
3 2012-11-22 18:08:35 u4  txt  hello you 
4 2012-11-22 18:08:37 u5  txt  hello you 

、そのテキストが行1および2と同様であるが、そのタイムスタンプが3秒の範囲内 ないからです。

Iはduplicate()メソッドのパラメータとしてカラム日時とMSGを定義しようとしたが、タイムスタンプが一致しないので、空のデータフレームを返す:

mask = df.duplicated(subset=['datetime', 'msg'], keep=False) 

print(df[mask]) 
Empty DataFrame 
Columns: [datetime, user, type, msg, MD5] 
Index: [] 

私は範囲を定義することができる方法はあります私の "datetime"パラメータのために?説明するために、のようなもの :

mask = df.duplicated(subset=['datetime_between_3_seconds', 'msg'], keep=False) 

ここにすべてのヘルプは、いつものように非常に高く評価されるだろう。

答えて

1

このコードはサンプルデータに適用されますが、極端な場合にはこれを回避する必要があります。

私はあなたがdfに最初に表示されたときからメッセージを除外したいと思っています。別のしきい値の後に再び表示される場合、文字列を保持するインスタンスがある場合は、機能しません。

要するに、データフレームと「msg」をフィルタリングする関数を作成しました。メッセージが最初に表示されたときのタイムスタンプが表示され、それが表示される他のすべての時間と比較されます。

最初に表示されてから3秒以内に表示されるインスタンスのみを選択します。

import numpy as np 
    import pandas as pd 
    #function which will return dataframe containing messages within three seconds of the first message 
    def get_info_within_3seconds(df, msg): 
     df_of_msg = df[df['msg']==msg].sort_values(by = 'datetime') 
     t1 = df_of_msg['datetime'].reset_index(drop = True)[0] 
     datetime_deltas = [(i -t1).total_seconds() for i in df_of_msg['datetime']] 
     filter_list = [i <= 3.0 for i in datetime_deltas] 
     return df_of_msg[filter_list] 

    msgs = df['msg'].unique() 
    #apply function to each unique message and then create a new df 
    new_df = pd.concat([get_info_within_3seconds(df, i) for i in msgs]) 
+0

あなたの助けてくれてありがとう、Tkanno!あなたの提案も役に立ちました! – dliv

3

コードのこの部分は、予想される出力

df[(df.groupby(["msg"], as_index=False)["datetime"].diff().fillna(0).dt.seconds <= 3).reset_index(drop=True)] 

を与える私はデータフレームの「MSG」欄にグループ化し、そのデータフレームの「日時」列を選択し、内蔵機能diffを使用しています。 Diff関数は、その列の値の差を求めます。 NaT値をゼロで埋め、3秒未満の値を持つインデックスのみを選択します。

上記のコードを使用する前に、データフレームがdatetimeで昇順にソートされていることを確認してください。

+0

私の答えが役に立ったら、それを受け入れることを忘れないでください。お返事ありがとうございます。 –

+0

はい、承諾しました。ご協力いただきありがとうございます(遅れてごめんなさい)!それは私が必要なことをする。 – dliv

+0

@dliv回答を投票していただきありがとうございます。私はあなたを助けることができてうれしい。このリンクを[承認](https://stackoverflow.com/help/accepted-answer)の回答にチェックしてください。 –

関連する問題