所以我正在调查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替换。如果我不得不猜测,我会说这是因为第二帧被重新索引作为加入过程的一部分,重新索引会删除我的值。
这里发生了什么?
答案 0 :(得分:1)
使用可选填充逻辑将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)
然后,您将保留初始数据值并重新索引数据框。