2016-04-25 7 views
0

フィールド 'MachineName'、 'LocalIPAddress'に基づいてデータフレームをグループ化し、各グループの連続する日付の差分を検索します。日付差分はdiff()を使用して

df2 = df.groupby(['MachineName', 'LocalIPAddress', 'DateTime'])['DateTime'].agg(
    ['count']).reset_index() 
df2['DateTime'] = pd.to_datetime(df2['DateTime']) 
df2['timedif'] = df2['DateTime'].diff() 

これは、最初のグループに適していますが、2番目のグループのために、それは最初から起動しない、むしろそれは別のグループであり、その前のレコードの日時から日時を減算します。

サンプルデータ:

MachineName LocalIPAddress DateTime count timedif 
0 BMTSAFT04 10.18.0.186 2016-04-13 03:42:29.865 1 NaT 
1 BMTSAFT04 10.18.0.186 2016-04-13 08:48:33.005 1 05:06:03.140000 
2 BMTSAFT04 10.18.0.186 2016-04-13 10:16:28.612 1 01:27:55.607000 
3 BMTSAFT04 10.18.0.186 2016-04-13 10:31:33.343 1 00:15:04.731000 
4 BMTSAFT04 10.18.0.186 2016-04-13 23:43:12.068 1 13:12:56.580000 
5 BMTSYSP05 10.20.9.253 2016-04-13 06:08:53.584 1 -1 day +06:25:41 
6 BMTSYSP05 10.20.9.253 2016-04-13 12:01:57.563 1 05:53:03.979000 

5行目は、異なるグループに属しているので、時間差が-1 day +06:25:41されるべきではなく、それがNATなければなりません。私は、各グループに適用される相違のロジックが必要です。

ご協力いただければ幸いです!

答えて

0

reset_index()を呼び出した後、df2はもうpandas.core.groupby.DataFrameGroupByではありません。それは普通のpandas.core.frame.DataFrameです。あなたはもはや単純なグループではなく、単純なDataFrameだけでグループの操作ができなくなりました。要するに

、あなたがこれを行うとき:

df2['timedif'] = df2['Date'].diff() 

を使用すると、シリーズ全体のdiff()、「非グループ化」シリーズを実行しているという事実にあり、あなたはあなたが得る値を取得する理由です。

これはあなたのサンプルデータフレーム(あなたはインデックスをリセットした後)の場合:あなたの説明で

In [222]: df_sample 
Out[222]: 
        DateTime LocalIPAddress MachineName count 
0 2016-04-13 03:42:29.865 10.18.0.186 BMTSAFT04  1 
1 2016-04-13 08:48:33.005 10.18.0.186 BMTSAFT04  1 
2 2016-04-13 10:16:28.612 10.18.0.186 BMTSAFT04  1 
3 2016-04-13 10:31:33.343 10.18.0.186 BMTSAFT04  1 
4 2016-04-13 23:43:12.068 10.18.0.186 BMTSAFT04  1 
5 2016-04-13 06:08:53.584 10.20.9.253 BMTSYSP05  1 
6 2016-04-13 12:01:57.563 10.20.9.253 BMTSYSP05  1 

あなたはいくつかの点で言っている:

5行目はに属し異なるグループ

実際、インデックスをリセットする前に、多くの異なる列でグループ化するので、すべてのサンプル行が異なるグループにあります。しかし、私はこの場合はMachineNameでグループ化することを前提としており、ここではMachineNameでグループ化します。

In [227]: df_sample.groupby('MachineName').apply(lambda x: x.DateTime.diff()) 
Out[227]: 
MachineName 
BMTSAFT04 0    NaT 
      1 05:06:03.140000 
      2 01:27:55.607000 
      3 00:15:04.731000 
      4 13:11:38.725000 
BMTSYSP05 5    NaT 
      6 05:53:03.979000 
Name: DateTime, dtype: timedelta64[ns] 

私はこれが役立つことを願っています!

+0

@ user3447653あなたは何をしようとしていたのですか? – Thanos

関連する問題