Pandas Dataframe根据条件更新前一个数据框的行值

2024-05-29 04:07:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧如下。我想根据以下条件替换行值。在

如果3个连续的前一行值为0,则保持该值不变,或者如果只有一个前一行值为0,则通过对该特定IEMI的最后3行进行滚动平均来填充该行。在

首先是dataframe (df)。在

IMEI        KVA          KwH            Expected KVA
55647     1307.65       1020.33            1307.65
55468     2988.00       1109.05            2988.00
55647     0.00          977.87             0.00
55467     0.00          1388.25            0.00
55647     0.00          445.37             0.00
55469     1888.97       933.48             1888.97
55647     1338.65       1120.33            1338.65
55468     2088.00       1019.05            2088.00
55647     0.00          977.87             =(1307.65+0.00+1338.65)/3=882.1
55469     1455.28       1388.25            1455.28
55648     2144.38       445.37             2144.38
55469     1888.97       933.48             1888.97

请注意Expected KVA列的计算。由于第9行的实际KVA值为0,因此Expected KVA的值是IEMI 55647最后三次观察(KVA)的简单平均值。但在第3、第4和第5行,因为IEMI55647的3KVA值为0,因此Expected KVA值也为0。在

编辑编辑-进一步 下面是一个伪代码片段。我有reset_index。但这可能行不通

^{pr2}$

我相信上面的代码片段可能会失败,因为我已经排序了IEMI,因此索引被扭曲了。在

如何实现?与for函数耦合的for循环?有什么想法吗?在


Tags: 数据代码编辑dataframedffor条件平均值
1条回答
网友
1楼 · 发布于 2024-05-29 04:07:32

下面是我想到的:(我用IMEI:55674添加了3行,只是为了测试)

删除一组3的连续0(无需操作)并对数据帧切片:

import itertools
def consecutive(data, stepsize=1):
    return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)

a = np.array(df[df.KVA == 0.00].index)
l = consecutive(a)
to_exclude=list(itertools.chain.from_iterable([i.tolist() for i in l if len(i)==3]))
pd.options.mode.chained_assignment = None
df1 = df.loc[~df.index.isin(to_exclude)]
>>df1
    IMEI    KVA     KwH
0   55647   1307.65 1020.33
1   55468   2988.00 1109.05
5   55469   1888.97 933.48
6   55647   1338.65 1120.33
7   55468   2088.00 1019.05
8   55647   0.00    977.87
9   55469   1455.28 1388.25
10  55648   2144.38 445.37
11  55469   1888.97 933.48
12  55674   0.00    6433.00
13  55674   1345.00 6542.00
14  55674   3456.00 6541.00

np.nan分配剩余的0,用transform和{}用平均值

^{pr2}$

那么只要concat和{}我们之前遗漏的那些:

pd.concat([df1,df.loc[df.index.isin(to_exclude)]]).sort_index()

    IMEI    KVA         KwH
0   55647   1307.650000 1020.33
1   55468   2988.000000 1109.05
2   55647   0.000000    977.87
3   55467   0.000000    1388.25
4   55647   0.000000    445.37
5   55469   1888.970000 933.48
6   55647   1338.650000 1120.33
7   55468   2088.000000 1019.05
8   55647   882.100000  977.87
9   55469   1455.280000 1388.25
10  55648   2144.380000 445.37
11  55469   1888.970000 933.48
12  55674   1600.333333 6433.00
13  55674   1345.000000 6542.00
14  55674   3456.000000 6541.00

相关问题 更多 >

    热门问题