【问题标题】:Replace missing values in Pandas with previous value if not NAN如果不是 NAN,则用以前的值替换 Pandas 中的缺失值
【发布时间】:2021-02-13 08:58:52
【问题描述】:

我需要您对以下代码的帮助。我有 df1 与我试图与 df2 合并的汇率和日期列。 df1 缺少汇率值(周末和节假日)。对于周末汇率值,我想使用最后一个可用值(例如,如果 2019-05-01 的汇率为 nan,我希望它使用 2019-04-01 汇率值)。我尝试了两种方法均未成功:

  1. 从 DF1 中删除 nan 值,如果找不到日期,则以某种方式指示合并以获取最后一个可用值(因为我们已将其删除)
  2. 用最后一个可用值填充 df1 nan 值。

这是两个数据框(如果您复制并粘贴它,则会收到无法识别时间戳名称的错误。我无法将日期值粘贴到此处,因为我总是将日期值作为时间戳对象获取)。我希望你能帮助我解决这两种方法,因为我相信知道它会很有用。

df1={'Fecha': {0: Timestamp('2019-01-01 00:00:00'),
  1: Timestamp('2019-01-02 00:00:00'),
  2: Timestamp('2019-01-03 00:00:00'),
  3: Timestamp('2019-01-04 00:00:00'),
  4: Timestamp('2019-01-05 00:00:00'),
  5: Timestamp('2019-01-06 00:00:00'),
  6: Timestamp('2019-01-07 00:00:00'),
  7: Timestamp('2019-01-08 00:00:00'),
  8: Timestamp('2019-01-09 00:00:00'),
  9: Timestamp('2019-01-10 00:00:00')},
 'ER': {0: nan,
  1: 19.1098,
  2: 19.2978,
  3: 19.2169,
  4: nan,
  5: nan,
  6: 19.076,
  7: 19.1627,
  8: nan,
  9: 19.7792}}



df2={'Fecha': {0: Timestamp('2019-01-01 00:00:00'),
  1: Timestamp('2019-01-02 00:00:00'),
  2: Timestamp('2019-01-03 00:00:00'),
  3: Timestamp('2019-01-04 00:00:00'),
  4: Timestamp('2019-01-05 00:00:00'),
  5: Timestamp('2019-01-06 00:00:00'),
  6: Timestamp('2019-01-07 00:00:00'),
  7: Timestamp('2019-01-08 00:00:00'),
  8: Timestamp('2019-01-09 00:00:00'),
  9: Timestamp('2019-01-10 00:00:00')},
 'letters': {0: "a",
  1: "b",
  2: "c",
  3: "d",
  4: "e",
  5: "f",
  6: "g",
  7: "h",
  8: "i",
  9: "j"}}

非常感谢!

【问题讨论】:

  • 你试过什么代码?这看起来像 pandas fillnamethod='ffill' 应该可以工作
  • 嗨!我尝试使用 lambda 应用,但我不知道如何引用以前的 na 值。

标签: python pandas dataframe date merge


【解决方案1】:

我认为您不需要 lambda(正如您在 cmets 中提到的那样)。您想要实现的目标可以通过.ffill 方法完成:

>>> df1["ER"].ffill()
0        NaN
1    19.1098
2    19.2978
3    19.2169
4    19.2169
5    19.2169
6    19.0760
7    19.1627
8    19.1627
9    19.7792
Name: ER, dtype: float64

要合并两个数据框,请使用pd.merge:

>>> df1["ER"].ffill(inplace=True)
>>> pd.merge(df1, df2, on="Fecha")
       Fecha       ER letters
0 2019-01-01      NaN       a
1 2019-01-02  19.1098       b
2 2019-01-03  19.2978       c
3 2019-01-04  19.2169       d
4 2019-01-05  19.2169       e
5 2019-01-06  19.2169       f
6 2019-01-07  19.0760       g
7 2019-01-08  19.1627       h
8 2019-01-09  19.1627       i
9 2019-01-10  19.7792       j

【讨论】:

    【解决方案2】:

    仅用于一般知识: 在您的示例数据中,它将引发无法识别的“时间戳”和“南”的错误。要使此数据集可用,您只需在 de Timestamp 之前添加 pandaspd

    pd.Timestamp('2019-01-06 00:00:00')
    

    对于指示空值,您可以使用:

    # First option - pandas system
    import pandas as pd
    {0: pd.NA}
    
    # Second option - numpy system
    import numpy as np
    {0: np.nan}
    
    # Third oprtion - Pure python
    {0: None}
    

    【讨论】:

      【解决方案3】:

      我找到了一种使用 pd.merge_asof() 函数实现此目的的方法。如果它没有找到要合并的键值,它会给你前一个。不过,排序至关重要。

      它就像 excel 查找一样工作(不是 VLOOK UP,而是 LOOKUP - 没有 v 或 h-)。

      谢谢大家!

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 1970-01-01
        • 2013-01-17
        • 2023-03-23
        • 2011-04-07
        • 2020-11-23
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多