![](/img/trans.png)
[英]Create a new column in Pandas Dataframe based on the 'NaN' values in another column
[英]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.