[英]Most efficient way to enlarge the active area of a binary series pandas?
我有一個 pandas dataframe df
:
車 | 打開 | 時間 |
---|---|---|
奧迪A5 | 0 | 0 |
奧迪A5 | 0 | 1 |
奧迪A5 | 0 | 2 |
奧迪A5 | 1 | 3 |
奧迪A5 | 1 | 4 |
奧迪A5 | 0 | 5 |
奧迪A5 | 0 | 6 |
奧迪A5 | 0 | 7 |
奧迪A5 | 1 | 8 |
奧迪A5 | 1 | 9 |
奔馳Class A | 1 | 0 |
奔馳Class A | 1 | 1 |
奔馳Class A | 1 | 2 |
奔馳Class A | 0 | 3 |
奔馳Class A | 0 | 4 |
奔馳Class A | 1 | 5 |
奔馳Class A | 1 | 6 |
奔馳Class A | 0 | 7 |
奔馳Class A | 0 | 8 |
奔馳Class A | 1 | 9 |
我想將二進制系列Open
的活動部分放大n
單位,但是在將 dataframe 分組后Car
。
活動部分是一組被 0 包圍的連續 1,或者只有 0 作為前一個值,或者只有 0 作為下一個值。 該系列只有 1 作為值的情況被忽略。
如果n = 1
,我想得到以下 dataframe:
車 | 打開 | 時間 |
---|---|---|
奧迪A5 | 0 | 0 |
奧迪A5 | 0 | 1 |
奧迪A5 | 1 | 2 |
奧迪A5 | 1 | 3 |
奧迪A5 | 1 | 4 |
奧迪A5 | 0 | 5 |
奧迪A5 | 0 | 6 |
奧迪A5 | 1 | 7 |
奧迪A5 | 1 | 8 |
奧迪A5 | 1 | 9 |
奔馳Class A | 1 | 0 |
奔馳Class A | 1 | 1 |
奔馳Class A | 1 | 2 |
奔馳Class A | 0 | 3 |
奔馳Class A | 1 | 4 |
奔馳Class A | 1 | 5 |
奔馳Class A | 1 | 6 |
奔馳Class A | 0 | 7 |
奔馳Class A | 1 | 8 |
奔馳Class A | 1 | 9 |
我可以使用以下代碼獲取所有活動部件的索引:
df = pd.DataFrame(
{
"Car": ["Audi A5"]*10 + ["Mercedes Class A"]*10,
"Time" : list(range(10)) + list(range(10)),
"Open" : [0,0,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,1]
}
)
def enlarge(dataframe : pd.DataFrame, sensor : str, n : int = 1) -> pd.DataFrame:
get_group_indexes = (
lambda x: x.index[0]
if x.index[-1] - x.index[0] >= 1
else None
)
groups = (
dataframe[sensor]
.eq(0)
.cumsum()[dataframe[sensor].ne(0)]
.to_frame()
.groupby(sensor)
.apply(get_group_indexes)
.dropna()
)
if groups.empty:
return dataframe
for index in groups:
dataframe.loc[index-n:index, sensor] = 1
return dataframe
當我不必按Car
分組但我想在執行此轉換之前按此列分組時,它可以工作。 有人知道如何使用 pandas 技巧有效地實現這一目標嗎? 謝謝。
bfill
,您可以在屏蔽非 1 值后對每個組進行限制:
n=1
df['Open2'] = (df['Open']
.where(df['Open'].eq(1))
.groupby(df['Car']).bfill(limit=n)
.fillna(df['Open'], downcast='infer')
)
output(為清楚起見,作為新列“Open2”):
Car Time Open Open2
0 Audi A5 0 0 0
1 Audi A5 1 0 0
2 Audi A5 2 0 1
3 Audi A5 3 1 1
4 Audi A5 4 1 1
5 Audi A5 5 0 0
6 Audi A5 6 0 0
7 Audi A5 7 0 1
8 Audi A5 8 1 1
9 Audi A5 9 1 1
10 Mercedes Class A 0 1 1
11 Mercedes Class A 1 1 1
12 Mercedes Class A 2 1 1
13 Mercedes Class A 3 0 0
14 Mercedes Class A 4 0 1
15 Mercedes Class A 5 1 1
16 Mercedes Class A 6 1 1
17 Mercedes Class A 7 0 0
18 Mercedes Class A 8 0 1
19 Mercedes Class A 9 1 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.