熊猫:重新索引数据框架不会保留初始值

时间:2016-04-06 13:59:22

标签: python pandas

我有一个由5个递减系列组成的数据帧(每行290行),其值介于0和1之间。

数据看起来像这样:

    A   B   C   D   E
0.60    0.998494    1.0 1.0 1.0 1.0
0.65    0.997792    1.0 1.0 1.0 1.0
0.70    0.996860    1.0 1.0 1.0 1.0
0.75    0.995359    1.0 1.0 1.0 1.0
0.80    0.992870    1.0 1.0 1.0 1.0

data

我想重新索引数据帧,以便每行之间有0.01个增量。我尝试了pd.DataFrame.reindex但无济于事:这会返回一个数据框,其中大部分值为np.NaN

import pandas as pd
df = pd.read_csv('http://pastebin.com/raw/yeHdk2Gq', index_col=0)
print df.reindex(np.arange(0.6, 3.5, 0.025)).head()

仅返回两个有效行,并将其他288个转换为NaN

    A   B   C   D   E
0.600   0.998494    1.0 1.0 1.0 1.0
0.625   NaN NaN NaN NaN NaN
0.650   0.997792    1.0 1.0 1.0 1.0
0.675   NaN NaN NaN NaN NaN
0.700   NaN NaN NaN NaN NaN ##This row existed before reindexing

Pandas不能将新索引与初始值匹配,尽管似乎没有舍入问题(初始索引不超过2位小数)。

这似乎与我的数据有某种关系,因为以下是按预期工作的:

df = pd.DataFrame(np.random.randn(10,3), columns=['A', 'B', 'C'])\
       .reindex(np.arange(1, 10, 0.5))
print df.head()

给出了:

            A         B         C
1.0  0.206539  0.346656  2.578709
1.5       NaN       NaN       NaN
2.0  1.164226  2.693394  1.183696
2.5       NaN       NaN       NaN
3.0 -0.532072 -1.044149  0.818853

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是因为numpy的精确度。

In [31]: np.arange(0.6, 3.5, 0.025).tolist()[0:10]

Out[31]: 
[0.6, 0.625, 0.65, 0.675, 0.7000000000000001, 0.7250000000000001, 
 0.7500000000000001, 0.7750000000000001, 0.8000000000000002, 0.8250000000000002]

答案 1 :(得分:0)

正如@Danche和@EdChum指出的那样,这实际上是一个NumPy舍入问题。以下作品:

df = pd.read_csv('http://pastebin.com/raw/yeHdk2Gq', index_col=0)\
       .reindex([round(i, 5) for i in np.arange(0.6, 3.5, 0.01)])\
       .interpolate(kind='cubic', axis=0)

按预期返回:

    A   B   C   D   E
0.60    0.998494    1.0 1.0 1.0 1.0
0.61    0.998354    1.0 1.0 1.0 1.0
0.62    0.998214    1.0 1.0 1.0 1.0
0.63    0.998073    1.0 1.0 1.0 1.0
0.64    0.997933    1.0 1.0 1.0 1.0

由于