【问题标题】:Fill row NaN value by comparing latest known value and first know before NaN row通过比较最新的已知值和 NaN 行之前的第一个已知值来填充行 NaN 值
【发布时间】:2020-02-18 10:09:18
【问题描述】:

我对 Python 和数据科学真的很陌生。

我有一个包含 100K+ 行的数据集,我在这个数据集上有两列。

第一个是Datetime列,我们命名为A,最后一个是Integer,我们命名为B

我的数据集按 A 列排序。

在我的数据集中,B 的一些值是 NaN。

我想通过这样做来填充我的 NaN 值:

对于具有 NaN B 值的第 i 行: 如果(我的第 i 行之前的最新无 NaN B 值 - 第 i 行之后的第一个无 NaN B 值)== 0 将第 i 行的 B 值设置为“我的第 i 行之前的最新无 NaN B 值” 否则将其设置为“我的第 i 行之前的最新无 NaN B 值”-“我的第 i 行之前的最新无 NaN B 值”的 A 列与我的第 i 行的 A 列之间的差异(以秒为单位)

让我用一个例子来解释一下自己:

我的数据集如下所示:

                     A     B
0  2019-03-13 08:12:20  10.0
1  2019-03-13 08:12:21   NaN
2  2019-03-13 08:12:22   NaN
3  2019-03-13 08:12:23  10.0
4  2019-03-13 08:12:24   NaN
5  2019-03-13 08:12:25   NaN
6  2019-03-13 08:12:26   7.0

最后我希望它看起来像这样:

                     A     B
0  2019-03-13 08:12:20  10.0
1  2019-03-13 08:12:21  10.0
2  2019-03-13 08:12:22  10.0
3  2019-03-13 08:12:23  10.0
4  2019-03-13 08:12:24   9.0
5  2019-03-13 08:12:25   8.0
6  2019-03-13 08:12:26   7.0

(行 id=1 的列 B)和(行 id=2 的列 B)是 10,因为(行 id=0 的列 B)=(行 id=3 的列 B)。 (行 id=4 的列 B)是 9,因为(行 id=3 的列 B)=/=(行 id=6 的列 B)和(行 id=3 的列 B)-(time_diff(列 A 的行 id=3,行 id=4)) 的 A 列。

我能做的最好的是将 NaN 设置为最新的已知值,但这真的不是我想要做的。

df=pd.DataFrame({'A': ["2019-03-13 08:12:20", "2019-03-13 08:12:21", "2019-03-13 08:12:22", "2019-03-13 08:12:23", "2019-03-13 08:12:24", "2019-03-13 08:12:25"], 'B': [10, 10, 10, 9, 8, 7]})
df['B'] = df['B'].replace({'B': {0: np.nan}}).ffill()
print(df)

你们有什么干净的方法来实现这一点吗?

【问题讨论】:

    标签: python pandas data-science


    【解决方案1】:

    您应该能够使用interpolate 函数来实现这一点 -

    df.interpolate(method ='linear', limit_direction ='forward') 
    

    如果可能,它将尝试以您正在寻找的方式填写数据。 (在列的开头和结尾使用 NaN 值不太有效)

    【讨论】:

    • 谢谢,它成功了!你有什么资源可以让我为数据科学学习 python 和 pandas 吗?
    猜你喜欢
    • 2018-03-19
    • 2020-09-14
    • 2022-07-22
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多