比方说,我们正尝试按列表重新索引数据框,如下所示:
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
我不知道这两种方式有何不同?第一种方式会产生什么,第二种方式会产生什么?
我尝试查找文档和其他资源,但找不到解释。非常感谢。
答案 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