如果不是 NAN,则用以前的值替换 Pandas 中的缺失值

Posted

技术标签:

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

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

    从 DF1 中删除 nan 值,如果找不到日期,则以某种方式指示合并以获取最后一个可用值(因为我们已将其删除) 用最后一个可用值填充 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 fillna 和 method='ffill' 应该可以工作 嗨!我尝试使用 lambda 应用,但我不知道如何引用以前的 na 值。 【参考方案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-)。

谢谢大家!

【讨论】:

以上是关于如果不是 NAN,则用以前的值替换 Pandas 中的缺失值的主要内容,如果未能解决你的问题,请参考以下文章

如果 NaN 用另一列替换,Pandas 将组中的最后一项替换

Pandas 多索引行和列:用匹配行中的值替换 NaN

Python Pandas 将一列中的 NaN 替换为第二列对应行的值

06 pandas DataFrame - 数据过滤、NaN处理、统计方法

如果在 Pandas 的任一列中找到,则删除两个 float64 值

Pandas:根据另一列的键在现有列上映射字典值以替换 NaN