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

时间:2020-10-30 21:42:41

标签: python pandas dataframe date merge

以下代码需要您的帮助。我的df1带有要与df2合并的汇率和日期列。 df1缺少汇率值(在周末和节假日)。对于周末的汇率值,我想使用最后一个可用的值(例如,如果2019-05-01的汇率是nan,我希望它使用2019-04-01的汇率值)。我尝试了两个选项失败:

  1. 从DF1中消除nan值,并在没有找到日期的情况下以某种方式指示合并以获取最后一个可用值(因为我们消除了它)
  2. 用最后一个可用值填充df1 nan值。

这都是两个数据框(如果复制并粘贴它,则会出现无法识别时间戳名称的错误。由于我总是将日期值作为TimeStamp对象,因此无法将日期值粘贴到此处)。希望您能帮我解决这两个问题,因为我敢肯定,这对您很有帮助。

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"}}

非常感谢!

3 个答案:

答案 0 :(得分:1)

我认为您不需要lambda(如您在评论中所述)。您要实现的目标可以通过.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

答案 1 :(得分:0)

只是常识: 在您的示例数据中,它将为未识别的“时间戳”和“ nan”引发错误。要使此数据集可用,您只需在时间戳记之前添加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}

答案 2 :(得分:0)

我找到了一种使用pd.merge_asof()函数实现此目的的方法。如果找不到要合并的键值,则会为您提供上一个键值。不过,排序至关重要。

它的工作方式与excel查找相同(不是VLOOK UP,而是LOOKUP-没有v或h-)。

谢谢大家!