【问题标题】:Fill in NaNs with previous values of a specific column in Python用 Python 中特定列的先前值填充 NaN
【发布时间】:2018-03-28 16:21:22
【问题描述】:

我有一个 Pandas 数据框如下:

df =

                      open       high        low      close
Timestamp                                                      
2014-01-07 13:18:00  874.67040  892.06753  874.67040  892.06753
2014-01-07 13:19:00        NaN        NaN        NaN        NaN
2014-01-07 13:20:00        NaN        NaN        NaN        NaN
2014-01-07 13:21:00  883.23085  883.23085  874.48165  874.48165
2014-01-07 13:22:00        NaN        NaN        NaN        NaN

对于每个 NaN,它们应该取上一周期的收盘价。

编辑:我尝试过使用 df.fillna(method='ffill') 但它使每个 NaN 直接在其上方取值。我希望每个 NaN 在它之前只取 Close 的值。

使用填充产量:

                      open       high        low      close
Timestamp                                                      
2014-01-07 13:18:00  874.67040  892.06753  874.67040  892.06753
2014-01-07 13:19:00  874.67040  892.06753  874.67040  892.06753

但我正在寻找:

                      open       high        low      close
Timestamp                                                      
2014-01-07 13:18:00  874.67040  892.06753  874.67040  892.06753
2014-01-07 13:19:00  892.06753  892.06753  892.06753  892.06753

【问题讨论】:

  • 还有什么问题?你有什么办法解决的?
  • 编辑过的原帖
  • @Vaishali,@ASGM 这不是完全重复的......但是解决方案可能是使用循环的 2 行代码......
  • df.apply(lambda x: x.fillna(df.close.shift())).ffill() 工作!谢谢,正在尝试创建一个循环,但 apply() 是一种更简单的方法。
  • @Zero 我已经重新打开它,继续发布你的答案。

标签: python pandas dataframe


【解决方案1】:

几种方法:

In [3166]: df.apply(lambda x: x.fillna(df.close.shift())).ffill()
Out[3166]:
                          open       high        low      close
Timestamp
2014-01-07 13:18:00  874.67040  892.06753  874.67040  892.06753
2014-01-07 13:19:00  892.06753  892.06753  892.06753  892.06753
2014-01-07 13:20:00  892.06753  892.06753  892.06753  892.06753
2014-01-07 13:21:00  883.23085  883.23085  874.48165  874.48165
2014-01-07 13:22:00  874.48165  874.48165  874.48165  874.48165

In [3167]: df.fillna({c: df.close.shift() for c in df}).ffill()
Out[3167]:
                          open       high        low      close
Timestamp
2014-01-07 13:18:00  874.67040  892.06753  874.67040  892.06753
2014-01-07 13:19:00  892.06753  892.06753  892.06753  892.06753
2014-01-07 13:20:00  892.06753  892.06753  892.06753  892.06753
2014-01-07 13:21:00  883.23085  883.23085  874.48165  874.48165
2014-01-07 13:22:00  874.48165  874.48165  874.48165  874.48165

【讨论】:

  • 零。当我这样做时,我在每一行和每一列中都得到相同的数字,例如892.06753 用于每个 nan 值,包括它应该位于 874.48165 的位置。这就像它在 Close 中获取第一个前一个数字并在整个数据框中使用它。知道为什么吗?
  • stackoverflow.com/questions/45262040/…我不得不用这个方法。
【解决方案2】:

您可以填写收盘价,然后在轴 1 上回填其余部分:

df.close.fillna(method='ffill', inplace=True)
df.fillna(method='backfill', axis=1, inpace=True)

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多