如果不是 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 之前添加 pandas
或 pd
:
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 将组中的最后一项替换
Python Pandas 将一列中的 NaN 替换为第二列对应行的值
06 pandas DataFrame - 数据过滤、NaN处理、统计方法