我有一个Pandas 数据框df:

Car Open Time
Audi A5 0 0
Audi A5 0 1
Audi A5 0 2
Audi A5 1 3
Audi A5 1 4
Audi A5 0 5
Audi A5 0 6
Audi A5 0 7
Audi A5 1 8
Audi A5 1 9
Mercedes Class A 1 0
Mercedes Class A 1 1
Mercedes Class A 1 2
Mercedes Class A 0 3
Mercedes Class A 0 4
Mercedes Class A 1 5
Mercedes Class A 1 6
Mercedes Class A 0 7
Mercedes Class A 0 8
Mercedes Class A 1 9

我想将二进制序列Open的有效部分放大n个单位,但在将数据帧按Car分组之后.

活动部分是一组连续的1,它们要么被0包围,要么只有0作为前一个值,或者只有0作为下一个值.忽略级数只有1作为值的情况.

如果为n = 1,我希望获得以下数据帧:

Car Open Time
Audi A5 0 0
Audi A5 0 1
Audi A5 1 2
Audi A5 1 3
Audi A5 1 4
Audi A5 0 5
Audi A5 0 6
Audi A5 1 7
Audi A5 1 8
Audi A5 1 9
Mercedes Class A 1 0
Mercedes Class A 1 1
Mercedes Class A 1 2
Mercedes Class A 0 3
Mercedes Class A 1 4
Mercedes Class A 1 5
Mercedes Class A 1 6
Mercedes Class A 0 7
Mercedes Class A 1 8
Mercedes 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 技巧来实现这一点?谢谢.

推荐答案

IIUC,屏蔽非1值后,您可以每组bfill个,但有一个限制:

n=1
df['Open2'] = (df['Open']
               .where(df['Open'].eq(1))
               .groupby(df['Car']).bfill(limit=n)
               .fillna(df['Open'], downcast='infer')
              )

输出(为清楚起见,作为新的"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

Python相关问答推荐

是否有使用纯霍夫曼编码的现代图像格式?

修剪Python框架中的尾随NaN值

当变量也可以是无或真时,判断是否为假

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

使用regex分析具有特定字符的字符串(如果它们存在)

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

如何使用stride_tricks.as_strided逆转NumPy数组

将HLS纳入媒体包

如何检测背景有噪的图像中的正方形

在Pandas DataFrame操作中用链接替换'方法的更有效方法

优化pytorch函数以消除for循环

使用groupby Pandas的一些操作

删除字符串中第一次出现单词后的所有内容

如何在给定的条件下使numpy数组的计算速度最快?

OR—Tools中CP—SAT求解器的IntVar设置值

ThreadPoolExecutor和单个线程的超时

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

如何使regex代码只适用于空的目标单元格

如何找出Pandas 图中的连续空值(NaN)?