簡體   English   中英

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

[英]Replace missing values in Pandas with previous value if not NAN

我需要您對以下代碼的幫助。 我有 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"}}

多謝!

我認為您不需要 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

僅用於一般知識:在您示例的數據中,它會因無法識別的“時間戳”和“nan”而引發錯誤。 要使此數據集可用,您只需在 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}

我找到了一種使用 pd.merge_asof() 函數來實現這一點的方法。 如果它沒有找到要合並的鍵值,它會給你前一個。 不過,排序很重要。

它的工作原理與 excel 查找一樣(不是 VLOOK UP,而是 LOOKUP - 沒有 v 或 h-)。

謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM