重新索引数据框会用NaN替换掉所有数据,为什么?

4

我在研究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))

我的所有值都被清除了。这个例子并不特别有用,但每次我使用重新索引命令时,无论上下文如何,它都会发生。同样地,当我尝试连接两个数据框架时:

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

在连接帧之前,被连接的帧中所有值(np.arange(365))都被替换为NaN。如果我必须猜测的话,我会说这是因为第二个帧在连接过程中被重新索引,而重新索引会擦除我的值。

这里到底发生了什么?

2个回答

7

文档中的原话

将DataFrame对象转换为新索引,可选择插入逻辑,并在先前索引中没有值的位置放置NA/NaN。除非新索引等同于当前索引且copy=False,否则会产生新对象。

以上强调为本人所加。

您可以使用 set_index 方法。

frame1.set_index(np.arange(365))

或者做你一开始做的事情

frame1.index = np.arange(365)

谢谢你的帮助!不过我还是不太明白你强调的那部分是什么意思。"在前一个索引中没有值的位置放置NaN" 对我来说似乎并不适用,因为在重新索引之前,我的所有位置都有值。这也无法解释.join()的问题。再次感谢! - Jacob
@Jacob,你的问题是“为什么重新索引会用NaN替换?”。强调的文本是解释原因的。它被明确设计成这样做的。所以你的问题在文档中已经得到了确切的回答。然而,我猜想reindexing并不是你想要的。你实际上想要使用set_index - piRSquared

2

我觉得之前的回答并没有回答到问题,所以我来补充一下。

关键在于,初始数据框的索引必须与重新索引的索引相同,这样才能起作用。 甚至名称也必须相同!因此,如果你的新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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接