【问题标题】:Pandas: Reindexing dataframe won't keep initial valuesPandas:重新索引数据框不会保留初始值
【发布时间】:2016-04-06 13:59:22
【问题描述】:

我有一个由 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

感谢您的帮助!

【问题讨论】:

  • IIUC 那么你可以拨打df.apply(pd.Series.interpolate)
  • 当然这是我的意图,但我无法重新索引我的数据框:应用 pd.DataFrame.reindex 会擦除初始值(参见第三个代码块,第 0.70 行)
  • 你能检查一下 0.70 是不是真正的值,可能有某种浮点不精确
  • 就是这样。打印 np.arange 不会显示小数点。感谢您的帮助

标签: python pandas


【解决方案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]

【讨论】:

    【解决方案2】:

    正如@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
    

    谢谢

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 2014-09-01
      • 2017-10-03
      • 2014-03-08
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2019-02-05
      • 2019-07-18
      相关资源
      最近更新 更多