gpt4 book ai didi

python - 将 NaN 替换为 Pandas Dataframe 中先前值的某个倍数

转载 作者:行者123 更新时间:2023-12-01 04:07:12 24 4
gpt4 key购买 nike

我有一个 pandas 数据框,其中一列是日期,另一列包含一些值和 NaN。示例,数据框如下 -

import pandas as pd
import numpy as np
df = pd.DataFrame({'a':pd.date_range(start="01/01/2013",periods=6, freq="D"),'b': [1,np.nan,np.nan,4,np.nan,7]})
df
a b
2013-01-01 1
2013-01-02 NaN
2013-01-03 NaN
2013-01-04 4
2013-01-05 NaN
2013-01-05 7

现在,我想用先前值的某个固定乘数来填充此 NaN,即如果固定乘数为 0.5,则上面的数据框在转换后将如下所示:

  a           b
2013-01-01 1
2013-01-02 0.5
2013-01-03 0.25
2013-01-04 4
2013-01-05 2
2013-01-05 7

执行此操作的方法之一是循环 b,然后使用 .loc 函数对其进行转换,即我们可以使用下面给定的代码片段

for i in range(df.shape[0]):
if np.isnan(df.loc[i, 'b']):
df.loc[i, 'b'] = df.loc[i-1, 'b']*0.5

虽然这效果很好,但它的扩展性不好 - 需要很多时间。因此,如果有人可以帮助我使用 pandas 内置函数更有效地完成此操作,那将非常有帮助。

谢谢!

最佳答案

我认为您不能以矢量化方式执行此操作,因为您的循环依赖于循环时就地修改的 df,您可以将操作限制为仅包含 NaN 的行:

In [32]:
while df['b'].isnull().any():
df.loc[df['b'].isnull(),'b'] = df['b'].shift() /2
df

Out[32]:
a b
0 2013-01-01 1.00
1 2013-01-02 0.50
2 2013-01-03 0.25
3 2013-01-04 4.00
4 2013-01-05 2.00
5 2013-01-06 7.00

时间

In [36]:
%%timeit
for i in range(df.shape[0]):
if np.isnan(df.loc[i, 'b']):
df.loc[i, 'b'] = df.loc[i-1, 'b']*0.5
1000 loops, best of 3: 1.27 ms per loop

In [40]:
%%timeit
while df['b'].isnull().any():
df.loc[df['b'].isnull(),'b'] = df['b'].shift() /2

10000 loops, best of 3: 91 µs per loop

关于python - 将 NaN 替换为 Pandas Dataframe 中先前值的某个倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35405704/

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