我有一个由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
我想重新索引数据帧,以便每行之间有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
感谢您的帮助!
答案 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
由于