我有一個資料框架,包含[3599 行 x 5 列]。我需要在一個資料框架中洗掉除最后一行以外的所有特定單詞之前的行,以計算 "delta"。這是一個資料框架的例子,我有:
。df =
白天的ProductCase時間戳delta
0 2020-01-01 00:00。 01 產品 2020-01-01 00:00: 01 NaT
1 2020-01-01 00: 00:02 產品 2020-01-01 00: 00:02 0 天 00:00:01
2 2020-01-01 00: 00:03 產品 2020-01-01 00: 00:03 0 天 00:00:01
3 2020-01-01 00: 00:04 NoProduct 2020-01-01 00: 00:04 0 天 00:00:01
4 2020-01-01 00: 00:05 NoProduct 2020-01-01 00: 00:05 0 天 00:00:01
5 2020-01-01 00: 00:06 NoProduct 2020-01-01 00: 00:06 0 天 00:00:01
6 2020-01-01 00: 00:07 NoProduct 2020-01-01 00: 00:07 0 天 00:00:01
7 2020-01-01 00: 00:08 產品 2020-01-01 00: 00:08 0 天 00:00:01
8 2020-01-01 00: 00:09 產品 2020-01-01 00: 00:09 0 天 00:00:01
9 2020-01-01 00:00: 10 NoProduct 2020-01-01 00: 00:10 0 天 00:00:01
10 2020-01-01 00:00: 11 NoProduct 2020-01-01 00: 00:11 0 天 00:00: 01
11 2020-01-01 00:00: 12 NoProduct 2020-01-01 00: 00:12 0 天 00:00:01
12 2020-01-01 00:00: 13 NoProduct 2020-01-01 00: 00:13 0 天 00:00: 01
13 2020-01-01 00:00: 14 NoProduct 2020-01-01 00: 00:14 0 天 00:00:01
時間
0 NaN
11.0
2 1.0
3 1.0
4 1.0
5 1.0
6 1.0
7 1.0
8 1.0
9 1.0
10 1.0
11 1.0
12 1.0
13 1.0
我想知道如何剔除所有包含 "NoProduct "的行,除了最后一行,并計算delta以獲得下面的資料框架。
daytime ProductCase timestamp delta
0 2020-01-01 00:00。 01 產品 2020-01-01 00:00: 01 NaT
1 2020-01-01 00: 00:02 產品 2020-01-01 00: 00:02 0 天 00:00:01
2 2020-01-01 00: 00:03 產品 2020-01-01 00: 00:03 0 天 00:00:01
3 2020-01-01 00: 00:07 NoProduct 2020-01-01 00: 00:07 0 天 00:00:04
4 2020-01-01 00: 00:08 產品 2020-01-01 00: 00:08 0 天 00:00:01
5 2020-01-01 00: 00:09 產品 2020-01-01 00: 00:09 0 天 00:00:01
6 2020-01-01 00:00: 14 NoProduct 2020-01-01 00: 00:14 0 天 00:00:05
時間
0 NaN
11.0
2 1.0
3 4.0
4 1.0
5 1.0
6 5.0
uj5u.com熱心網友回復:
為了放棄所有的'NoProduct'行,除了最后一行后面是'Product'行,使用一個二進制掩碼:
# Ensure dtypes are corrects.
df['daytime'] = pd.to_datetime(df['daytime'] )
df['timestamp'] = pd.to_datetime(df['timestamp'] )
df['delta'] = pd.to_timedelta(df['delta'] )
# 創建布爾掩碼。
m1 = df['ProductCase'/span>].eq('Product'/span>)
m2 = df['ProductCase'/span>].eq('NoProduct'/span>)
.eq(df['ProductCase'].shift(-1, fill_value='Product') .eq('Product')
mask = m1 | m2
# 對選定的行進行復制。
out = df[mask].copy()
#更新列值
out['delta'] = out['timestamp'].diff()
out['time'/span>] = out['delta'/span>].dt.total_seconds()
輸出:
daytime ProductCase timeestamp delta time
0 2020-01-01 00:00。 01 產品 2020-01-01 00:00: 01 NaT NaN
1 2020-01-01 00: 00:02 產品 2020-01-01 00: 00:02 0天 00:00:01 1。 0[/span>
2 2020-01-01 00: 00:03 產品 2020-01-01 00: 00:03 0天 00:00:01 1。 0[/span>
6 2020-01-01 00: 00:07 NoProduct 2020-01-01 00: 00:07 0天 00:00:04 4。 0[/span>
7 2020-01-01 00: 00:08 產品 2020-01-01 00: 00:08 0天 00:00:01 1。 0[/span>
8 2020-01-01 00: 00:09 產品 2020-01-01 00: 00:09 0天 00:00:01 1。 0[/span>
13 2020-01-01 00:00: 14 NoProduct 2020-01-01 00: 00:14 0天 00:00: 05 5。 0
細節:
>>> pd.concat([df['ProductCase'/span>], mask.rename('m1|m2'/span>) 。
m1.rename('m1'), m2.rename('m2') ], axis=1)
產品案例 m1|m2 m1 m2
0 Product True True False # m1, keep ('Product')
1 Product True True False # m1, keep ('Product')
2 Product True True # m1, keep ('Product')
3 NoProduct False False False
4 NoProduct False False False NoProduct
5 NoProduct False False False NoProduct
6 NoProduct True False True # m2, keep ( followed by 'Product')
7 Product True True False # m1, keep ('Product')
8 Product True True # m1, keep ('Product')
9 NoProduct False False False
10 NoProduct False False False NoProduct
11 NoProduct False False False NoProduct
12 NoProduct False False False NoProduct
13 NoProduct True False True # m2, 'shift'的特殊情況
對于特殊情況,使用fill_value='Product'在移位時創建一個虛擬行(idx 14),以確保它總是被保留。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/326414.html
標籤:
