重新索引数据帧用NaN替换我的所有数据,为什么?

时间:2017-04-06 20:41:18

标签: python-3.x pandas numpy

所以我正在调查Pandas的一些命令如何工作,我遇到了这个问题;当我使用reindex命令时,我的数据被NaN值替换。以下是我的代码:

>>>import pandas as pd

>>>import numpy as np

>>>frame1=pd.DataFrame(np.arange(365))

然后,我给它一个日期索引:

>>>frame1.index=pd.date_range(pd.datetime(2017, 4, 6), pd.datetime(2018, 4, 5))

然后我重新索引:

>>>broken_frame=frame1.reindex(np.arange(365))

aaa和我的所有价值观都被删除了。这个例子不是特别有用,但它会在我使用reindex命令时发生,看起来不管上下文如何。同样,当我尝试连接两个数据帧时:

>>>big_frame=frame1.join(pd.DataFrame(np.arange(365)), lsuffix='_frame1')

在连接帧之前,所附加的帧中的所有值(np.arange(365))都被NaN替换。如果我不得不猜测,我会说这是因为第二帧被重新索引作为加入过程的一部分,重新​​索引会删除我的值。

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

From the Docs

  

使用可选填充逻辑将DataFrame符合到新索引, 将NA / NaN放置在上一个索引中没有值的位置 。除非新索引等效于当前索引并且copy = False

,否则将生成新对象

强调我自己。

您想要set_index

frame1.set_index(np.arange(365))

或者做你在第一时间做的事情

frame1.index = np.arange(365)

答案 1 :(得分:0)

对于我认为问题正在解决的问题,我认为答案没有帮助,所以我对此进行了补充。

关键是初始数据框必须具有与您重新建立索引相同的索引,才能正常工作。 即使名称必须相同!因此,如果您是新的MultiIndex,则没有名称,您的初始数据框也必须没有名称。

m = pd.MultiIndex.from_product([df['col'].unique(), 
                                pd.date_range(df.date.min(), 
                                              df.date.max() + 
                                              pd.offsets.MonthEnd(1), 
                                              freq='M')])
df = df.set_index(['col','date']).rename_axis([None,None])
df.reindex(m)

然后,您将保留初始数据值并重新索引数据框。