假设我们正在尝试按列表重新索引数据框,如下所示:
dataframe.reindex(list)
确切的数据框和列表并不重要。
现在,如果列表大于原始索引,将出现一些NaN。我的问题是,是否要通过正向填充来填充NaN,以下两种方式之间有什么区别:
dataframe.reindex(list, method='ffill')
dataframe.reindex(list).ffill()
我尝试了几次,发现结果不同。
说我们有数据框是:
Jan 1
Apr 2
Jul 3
Oct 4
列表是:
list = ['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
我不知道这两种方式有何不同?第一种方式会产生什么,第二种方式会产生什么?
我试图查找文档和其他资源,但找不到解释。首先十分感谢。
编辑:
在版本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
:
方法:{None,'backfill'/'bfill','pad'/'ffill','nearest'}
用于在重新索引的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
like变量,因为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
创建了chain,则缺少值,并且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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句