繁体   English   中英

用 pandas dataframe 中的最后一个非空值替换 null

[英]Replace null with last non-null value in pandas dataframe

我知道这个问题之前已经被问过好几次了,但是我遇到了一个奇怪的行为,因此这个问题。

输入df

   A         B  C
USA 21-07-2018  
USA 22-07-2018  
USA 23-07-2018  1
USA 24-07-2018  1
USA 25-07-2018  1
USA 26-07-2018  1
USA 27-07-2018  1
USA 28-07-2018  
USA 29-07-2018  
USA 30-07-2018  1
USA 31-07-2018  1
USA 01-08-2018  1
USA 02-08-2018  1
USA 03-08-2018  1
USA 04-08-2018  
USA 05-08-2018  
USA 06-08-2018  1
USA 07-08-2018  1
USA 08-08-2018  1
USA 09-08-2018  1
USA 10-08-2018  1
USA 11-08-2018  
USA 12-08-2018  
USA 13-08-2018  1
USA 14-08-2018  1
USA 15-08-2018  1
USA 16-08-2018  1
USA 17-08-2018  1
USA 18-08-2018  
USA 19-08-2018

我尝试了以下两种方法

第一种方法

df['C'] = df['C'].fillna(method='ffill')

第二种方法

 df['C'] = df['C'].ffill()

它们都产生了相同的数据帧(Output_df)

  A          B  C
USA 21-07-2017  1
USA 22-07-2017  3010.77
USA 23-07-2017  3010.77
USA 24-07-2017  1
USA 25-07-2017  1
USA 26-07-2017  1
USA 27-07-2017  1
USA 28-07-2017  1
USA 29-07-2017  2995.23
USA 30-07-2017  2995.23
USA 31-07-2017  1
USA 01-08-2017  1
USA 02-08-2017  1
USA 03-08-2017  1
USA 04-08-2017  1
USA 05-08-2017  2974.39
USA 06-08-2017  2974.39
USA 07-08-2017  1
USA 08-08-2017  1
USA 09-08-2017  1
USA 10-08-2017  1
USA 11-08-2017  1

为什么我会得到像 3010.77、2974.39 等这样的值。这是否在某处被平均(输入 df 相当大 > 25k 行)?

我期望它是什么(Expected_df)

  A          B  C
USA 21-07-2018  1
USA 22-07-2018  1
USA 23-07-2018  1
USA 24-07-2018  1
USA 25-07-2018  1
USA 26-07-2018  1
USA 27-07-2018  1
USA 28-07-2018  1
USA 29-07-2018  1
USA 30-07-2018  1
USA 31-07-2018  1
USA 01-08-2018  1
USA 02-08-2018  1
USA 03-08-2018  1
USA 04-08-2018  1
USA 05-08-2018  1
USA 06-08-2018  1
USA 07-08-2018  1
USA 08-08-2018  1
USA 09-08-2018  1
USA 10-08-2018  1
USA 11-08-2018  1
USA 12-08-2018  1
USA 13-08-2018  1
USA 14-08-2018  1
USA 15-08-2018  1
USA 16-08-2018  1
USA 17-08-2018  1
USA 18-08-2018  1
USA 19-08-2018  1

再举一个我预期的 output 的例子

输入df

  A          B         C
AUS 21-07-2017  1.262584
AUS 22-07-2017  
AUS 23-07-2017  
AUS 24-07-2017  1.258671
AUS 25-07-2017  1.256456
AUS 26-07-2017  1.263913
AUS 27-07-2017  1.249957
AUS 28-07-2017  1.256032
AUS 29-07-2017  
AUS 30-07-2017  
AUS 31-07-2017  1.254626
AUS 01-08-2017  1.254064
AUS 02-08-2017  1.255136
AUS 03-08-2017  1.259949
AUS 04-08-2017  1.254466
AUS 05-08-2017  
AUS 06-08-2017  
AUS 07-08-2017  1.263796
AUS 08-08-2017  1.259692
AUS 09-08-2017  1.268349
AUS 10-08-2017  1.269008
AUS 11-08-2017  1.271738

(预期)输出df

  A          B         C
AUS 21-07-2017  1.262584
AUS 22-07-2017  1.262584
AUS 23-07-2017  1.262584
AUS 24-07-2017  1.258671
AUS 25-07-2017  1.256456
AUS 26-07-2017  1.263913
AUS 27-07-2017  1.249957
AUS 28-07-2017  1.256032
AUS 29-07-2017  1.256032
AUS 30-07-2017  1.256032
AUS 31-07-2017  1.254626
AUS 01-08-2017  1.254064
AUS 02-08-2017  1.255136
AUS 03-08-2017  1.259949
AUS 04-08-2017  1.254466
AUS 05-08-2017  1.254466
AUS 06-08-2017  1.254466
AUS 07-08-2017  1.263796
AUS 08-08-2017  1.259692
AUS 09-08-2017  1.268349
AUS 10-08-2017  1.269008
AUS 11-08-2017  1.271738

我认为您的列中有whitespaces 您需要用numpy.nan替换那些。

如果您不确定那里有多少个空白,您可以这样做:

import numpy as np
df['C'].replace(r'^\s*$', np.nan, regex=True, inplace=True)

然后使用ffill()来获得预期的行为。

df['C'] = df['C'].ffill()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM