![](/img/trans.png)
[英]Create a list from a list of dictionaries subject to a condition (counter and accumulator) in python
[英]Create a new column from loop condition (while, list id, counter, timestamp...)
我想用這個數據框創建一個新的時間戳列:
Timestamp Flag
0 2019-10-21 07:48:28.272688 end
1 2019-10-21 07:48:28.449916 end
2 2019-10-21 07:48:26.740378 begin
3 2019-10-21 07:48:26.923764 begin
4 2019-10-21 07:48:41.689466 end
5 2019-10-21 07:48:37.306045 begin
6 2019-10-21 07:58:00.774449 end
7 2019-10-21 07:57:59.223986 begin
8 2019-10-21 08:32:37.004455 end
9 2019-10-21 08:32:35.755252 begin
原理很簡單:
對於每一行,如果我有一個結束 => 計數器 +=1 否則(我有一個開始)=> 計數器 -=1
當 counter == 0 => 將時間戳的 id 保存在列表中
所以結果一定是:
Timestamp Flag
0 2019-10-21 07:48:28.272688 end
2 2019-10-21 07:48:26.740378 begin
3 2019-10-21 07:48:26.923764 begin
4 2019-10-21 07:48:41.689466 end
5 2019-10-21 07:48:37.306045 begin
6 2019-10-21 07:58:00.774449 end
7 2019-10-21 07:57:59.223986 begin
8 2019-10-21 08:32:37.004455 end
9 2019-10-21 08:32:35.755252 begin
因為: First end => counter = 1 (save(first row), ct = 2, ct = 1(save), ct = 0 (save), (save) ct = 1; ct =0 (save)...
目前我無法將相應的值添加到 ID 中,也許我在代碼中忘記了 (a) 個條件。
我的一段代碼:
counter = 0
i = 0
while i < len(df):
id_timestamp_to_save = []
if df.loc[i, 'Flag'] == 'end':
counter +=1
if counter == 1:
id_timestamp_to_save = list(range(i))
else:
counter -=1
if counter == 0:
id_timestamp_to_save = list(range(i))
df['New_Timestamp'] = df['New_Timestamp'].assign(id_timestamp_to_save)
i+=1
請幫幫我。
根據您的邏輯,只需將end
替換為1
並以-1
begin
,然后cumsum
:
counters = df.Flag.map({'end':1,'begin':-1}).cumsum().eq(0)
df[counters | counters.shift(fill_value=True)]
輸出:
Timestamp Flag
0 2019-10-21 07:48:28.272688 end
3 2019-10-21 07:48:26.923764 begin
4 2019-10-21 07:48:41.689466 end
5 2019-10-21 07:48:37.306045 begin
6 2019-10-21 07:58:00.774449 end
7 2019-10-21 07:57:59.223986 begin
8 2019-10-21 08:32:37.004455 end
9 2019-10-21 08:32:35.755252 begin
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.