簡體   English   中英

根據熊貓中另一列中相似值的分組來創建新列

[英]Create a new column based on Grouping of similar values in another column in pandas

嗨,我有一個事件數據框,其中包含日期時間,事件ID和傳感器ID。 我想將每個傳感器在一小時內發生的事件分組,並在可能的情況下用分組計數對其進行標記。 原始數據框

         sensor_id  event_id   time  
    0    A         e1            2017-02-14 05:30:00      
    1    A         e2            2017-02-14 05:45:00 
    2    A         e3            2017-02-14 08:30:00 
    3    B         e3            2017-02-14 05:20:00 
    4    B         e4            2017-02-14 05:30:00 
    5    B         e6            2017-02-14 05:45:00 
    6    C         e1            2017-02-14 05:30:00 
    7    C         e3            2017-02-14 07:30:00 
    8    C         e7            2017-02-14 09:35:00 

預期結果:

         sensor_id  event_id      time                  group 
    0    A         e1            2017-02-14 05:30:00      1
    1    A         e2            2017-02-14 05:45:00      1
    2    A         e3            2017-02-14 08:30:00      2
    3    B         e3            2017-02-14 05:20:00      1
    4    B         e4            2017-02-14 05:30:00      1
    5    B         e6            2017-02-14 05:45:00      1
    6    C         e1            2017-02-14 05:30:00      1
    7    C         e3            2017-02-14 07:30:00      2
    8    C         e7            2017-02-14 09:35:00      3

我知道我應該使用1小時的timdelta按用戶,事件和時間進行分組,但是我不知道如何進行其余操作。 任何提示將不勝感激。

我認為您需要進行雙重groupby(如果不是我們需要先對它們進行排序,則希望sensor_id進行排序),即

df['new'] = df.groupby('sensor_id').apply( lambda x : x.groupby(x['time'].dt.hour).ngroup()+1).values

輸出:

sensor_id event_id                time  new
0         A       e1 2017-02-14 05:30:00    1
1         A       e2 2017-02-14 05:45:00    1
2         A       e3 2017-02-14 08:30:00    2
3         B       e3 2017-02-14 05:20:00    1
4         B       e4 2017-02-14 05:30:00    1
5         B       e6 2017-02-14 05:45:00    1
6         C       e1 2017-02-14 05:30:00    1
7         C       e3 2017-02-14 07:30:00    2
8         C       e7 2017-02-14 09:35:00    3

您可以使用pd.TimeGrouper + ngroup按時間頻率分組。

df['time'] = pd.to_datetime(df.time)
df['group'] = df.set_index('time').groupby(['sensor_id', 
                    pd.TimeGrouper(freq='1H')], sort=False).ngroup().values

到目前為止,我們已經有了所需的東西,但是我們需要為每個sensor_id重置group值,因此需要進行另一個groupby調用。

df['group'] = df.groupby('sensor_id').group.apply(lambda x: x - x.min() + 1)

df

  sensor_id event_id                time  group
0         A       e1 2017-02-14 05:30:00      1
1         A       e2 2017-02-14 05:45:00      1
2         A       e3 2017-02-14 08:30:00      2
3         B       e3 2017-02-14 05:20:00      1
4         B       e4 2017-02-14 05:30:00      1
5         B       e6 2017-02-14 05:45:00      1
6         C       e1 2017-02-14 05:30:00      1
7         C       e3 2017-02-14 07:30:00      2
8         C       e7 2017-02-14 09:35:00      3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM