gpt4 book ai didi

python - 在 pandas 数据框中使用函数 nans 进行前向填充的快速方法

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:49 25 4
gpt4 key购买 nike

我有一个带有整数值的稀疏数据框。例如我们创建 df

df = pd.DataFrame(np.nan, index=range(10), columns=['A', 'B', 'C'])
df.loc[(0,'A')] = 6
df.loc[(3,'A')] = 8
df.loc[(4,'B')] = 2

看起来像这样

    A   B   C
0 6 NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 8 NaN NaN
4 NaN 2 NaN
5 NaN NaN NaN
6 NaN NaN NaN
7 NaN NaN NaN
8 NaN NaN NaN
9 NaN NaN NaN

现在我想用之前的值 -1 递归地填充每个 nan 值(如果它不是 nan)。例如,这段代码可以解决问题:

for j in range(len(df.index)):
df = df.fillna(value=df.shift(1)-1, limit=1)

它产生

   A   B   C
0 6 NaN NaN
1 5 NaN NaN
2 4 NaN NaN
3 8 NaN NaN
4 7 2 NaN
5 6 1 NaN
6 5 0 NaN
7 4 -1 NaN
8 3 -2 NaN
9 2 -3 NaN

问题是,即使我对 j 的范围有限制,应用于“真实”数据帧的这段代码也非常慢。由于它看起来非常接近于一个简单的 df.fillna(method='ffill'),后者速度更快,我想知道是否有办法加快这个过程。

提前感谢您的任何回答、见解或评论。

最佳答案

这不是一个通用的解决方案,但应该会在您的特定情况下产生预期的输出:

for col in df.columns:
g = df[col].notnull().cumsum()
df[col] = df[col].fillna(method='ffill') - df[col].groupby(g).cumcount()

基本上,您向前填充,然后减去最后一个非空值之后的连续 nan 数。

关于python - 在 pandas 数据框中使用函数 nans 进行前向填充的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421056/

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