gpt4 book ai didi

python - 计算 Pandas 当前行之前的空白数

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:03 24 4
gpt4 key购买 nike

我有一个 DataFrame,其中一行 is_blank 指示该行是否为 NaN。我想生成一个新功能,用于计算按 id 分组的每组记录中当前行之前的 NaN 行数。

下面的例子:

import pandas as pd
is_blank = [0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1]
id = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]
outval = [0, 0, 1, 2, 0, 1, 2, 0, 0, 0, 0]
test_df = pd.DataFrame({'id': id, 'is_blank': is_blank, 'outval': outval})

玩具数据集的外观如下。我想生成 outval 列。 outval[3] 是2,因为它前面有两个空格。然后 outval[4] 重置为零,因为该行之前没有空白行。

In[2]: test_df
Out[2]:
id is_blank outval
0 1 0 0
1 1 1 0
2 1 1 1
3 1 0 2
4 1 1 0
5 1 1 1
6 1 1 2
7 2 0 0
8 2 0 0
9 2 0 0
10 2 1 0

目前我正在尝试某种形式的累积计数:

In[3]: test_df.groupby(['id'])['is_blank'].cumsum().shift(1)
Out[3]:
0 NaN
1 0.0
2 1.0
3 2.0
4 2.0
5 3.0
6 4.0
7 5.0
8 0.0
9 0.0
10 0.0

但显然计数器不会在组内重置并最终计算所有空白行。我正在查看 expanding_apply 选项,但我无法完全理解它是如何工作的。

关于如何有效解决这个问题有什么想法吗?

最佳答案

矢量化方法

b = np.append(0, test_df.is_blank.values[:-1])
i = test_df.id.values

bc = b.cumsum()
w1 = np.where(b == 0)[0]
w2 = np.append(0, np.where(i[:-1] != i[1:])[0] + 1)
bd2 = bc[w2].repeat(np.diff(np.append(r[w2], k)))
bd1 = bc[w1].repeat(np.diff(np.append(r[w1], k)))

test_df.assign(outval=bc - np.fmax(bd1, bd2))

id is_blank outval
0 1 0 0
1 1 1 0
2 1 1 1
3 1 0 2
4 1 1 0
5 1 1 1
6 1 1 2
7 2 0 0
8 2 0 0
9 2 0 0
10 2 1 0

这样做的目的是找到将发生“重置”的位置。即 id 发生变化且 is_blank 为零时。

bcis_blank的累加和减去适当的值“重置”


以不那么直观的代码为代价...您可以获得更快的运行时间

朴素时间测试

enter image description here

关于python - 计算 Pandas 当前行之前的空白数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43442883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com