将python中的ffill作为链接方法和参数之间有什么区别?

时间:2019-02-15 06:38:10

标签: python python-3.x pandas dataframe

比方说,我们正尝试按列表重新索引数据框,如下所示:

dataframe.reindex(list)

确切的数据框和列表并不重要。

现在,如果列表大于原始索引,则将存在一些NaN。我的问题是,是否要通过向前填充来填充NaN,以下两种方式之间有什么区别?

dataframe.reindex(list, method='ffill')

dataframe.reindex(list).ffill()

我尝试了几次,发现结果不同。

说我们的数据框是:

Jan   1  
Apr   2  
Jul   3  
Oct   4  

,列表为:
列表= ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' ]

所以

dataframe.reindex(list, method='ffill')

成为:

Jan   1  
Feb   2  
Mar   3  
Apr   2  
May   3  
Jun   3  
Jul   3  
Aug   2  
Sep   4  
Oct   4  
Nov   3  
Dec   2  

dataframe.reindex(list).ffill()

成为:

Jan   1  
Feb   1  
Mar   1  
Apr   2  
May   2  
Jun   2  
Jul   3  
Aug   3  
Sep   3  
Oct   4  
Nov   4  
Dec   4 

我不知道这两种方式有何不同?第一种方式会产生什么,第二种方式会产生什么?

我尝试查找文档和其他资源,但找不到解释。非常感谢。

1 个答案:

答案 0 :(得分:1)

编辑:

在版本pandas 0.24.1中引发错误:

print (dataframe)
     Col
Jan    1
Apr    2
Jul    3
Oct    4

print (dataframe.index.is_monotonic_increasing)
False

L = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

print (dataframe.reindex(L, method='ffill'))
  

ValueError:索引必须是单调递增或递减

在文档中-DataFrame.reindex

  

方法:{无,“回填” /“填充”,“填充” /“填充”,“最近”}
  用于在重新索引的DataFrame中填充孔的方法。请注意:这仅适用于索引单调递增/递减的DataFrames / Series。

     

无(默认):不填补空白   填充/填充:将最后一个有效观察值传播到下一个有效观察值   回填/填充:使用下一个有效观察值填充空白   最接近:使用最接近的有效观测值来填补空白

第二个工作很好:

print (dataframe.reindex(L).ffill())
     Col
Jan  1.0
Feb  1.0
Mar  1.0
Apr  2.0
May  2.0
Jun  2.0
Jul  3.0
Aug  3.0
Sep  3.0
Oct  4.0
Nov  4.0
Dec  4.0

注意-请勿像变量一样使用list,因为python保留字(内置)。

区别是reindex之前的列中是否缺少值:

dataframe = pd.DataFrame({'col':[0,2,np.nan,5,np.nan]}, index=[1,3,5,6,8])
print (dataframe)
   col
1  0.0
3  2.0
5  NaN
6  5.0
8  NaN

print (dataframe.index.is_monotonic_increasing)
True

如果使用参数,则仅向前填充添加的行,此处为1,4,7行。

如果链ffill被创建缺失值,并且Series的所有数据都被向前填充:

L = range(10)
df = pd.concat([dataframe.reindex(L, method='ffill'),
                dataframe.reindex(L),
                dataframe.reindex(L).ffill()], 
                keys=('parameter','only_reindex','chained'), axis=1)
print (df)
  parameter only_reindex chained
        col          col     col
0       NaN          NaN     NaN
1       0.0          0.0     0.0
2       0.0          NaN     0.0
3       2.0          2.0     2.0
4       2.0          NaN     2.0
5       NaN          NaN     2.0
6       5.0          5.0     5.0
7       5.0          NaN     5.0
8       NaN          NaN     5.0
9       NaN          NaN     5.0

如果没有缺失值,结果是相同的:

dataframe = pd.DataFrame({'col':[0,2,8,5,9]}, index=[1,3,5,6,8])
print (dataframe)
   col
1    0
3    2
5    8
6    5
8    9

print (dataframe.index.is_monotonic_increasing)
True

L = range(10)
df = pd.concat([dataframe.reindex(L, method='ffill'),
                dataframe.reindex(L),
                dataframe.reindex(L).ffill()], 
                keys=('parameter','only_reindex','chained'), axis=1)
print (df)
  parameter only_reindex chained
        col          col     col
0       NaN          NaN     NaN
1       0.0          0.0     0.0
2       0.0          NaN     0.0
3       2.0          2.0     2.0
4       2.0          NaN     2.0
5       8.0          8.0     8.0
6       5.0          5.0     5.0
7       5.0          NaN     5.0
8       9.0          9.0     9.0
9       9.0          NaN     9.0