簡體   English   中英

擴大二進制系列 pandas 的有效區域的最有效方法?

[英]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.

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