重新索引数据框时出现问题:重新索引仅适用于唯一值索引对象。

3

当我尝试在 Pandas 中重新索引 dataframe 时,出现了一种非常奇怪的行为。我的 Pandas 版本是 0.10.0,我使用的是 Python 2.7。

基本上,当我载入一个 dataframe 时:

eurusd = pd.DataFrame.load('EUR_USD_30Min.df').drop_duplicates().dropna()

eurusd

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 119710 entries, 2003-02-02 17:30:00 to 2012-12-28 17:00:00
Data columns:
open     119710  non-null values
high     119710  non-null values
low      119710  non-null values
close    119710  non-null values
dtypes: float64(4)

然后我尝试在更大的日期范围内重新索引:

newindex  = pd.DateRange(datetime.datetime(2002,1,1), datetime.datetime(2012,12,31), offset=pd.datetools.Minute(30))

newindex

<class 'pandas.tseries.index.DatetimeIndex'>
[2002-01-01 00:00:00, ..., 2012-12-31 00:00:00]
Length: 192817, Freq: 30T, Timezone: None

我在尝试重新索引数据框时遇到了奇怪的行为。如果我重建数据集的其中一个大部分,我会得到以下错误:

eurusd[29558:29560].reindex(index=newindex)

Exception: Reindexing only valid with uniquely valued Index objects

但是,如果我对上述数据的两个子集执行相同的操作,就不会出现错误:
这是第一个子集,没有问题:
eurusd[29558:29559].reindex(index=newindex)

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 192817 entries, 2002-01-01 00:00:00 to 2012-12-31 00:00:00
Freq: 30T
Data columns:
open     1  non-null values
high     1  non-null values
low      1  non-null values
close    1  non-null values
dtypes: float64(4)

这里是第二个子集,仍然没有问题。

eurusd[29559:29560].reindex(index=newindex)

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 192817 entries, 2002-01-01 00:00:00 to 2012-12-31 00:00:00
Freq: 30T
Data columns:
open     1  non-null values
high     1  non-null values
low      1  non-null values
close    1  non-null values
dtypes: float64(4)

我真的为此疯狂,无法理解这样的原因。看起来这个数据帧没有重复项和重复索引......如果您需要,我可以提供数据帧的pickle文件。


eurusd.index.is_unique 的输出是什么?(也许当时钟改变时,时间会重复出现,除非您在日期时间的时区信息中包含它) - Andy Hayden
好问题!我尝试了一下,的确给了我一个False…但是这如何能解释不同数据集之间的不同行为呢? - mspadaccino
非常奇怪:如果我输入:eurusd[35700:35800].index.is_unique它会返回True但是如果我运行eurusd[35700:].index.is_unique却返回False... - mspadaccino
eurusd[35700:35701].index.is_unique 给我 Trueeurusd[35701:35800].index.is_unique 也给我 True.... 帮帮我... - mspadaccino
确实!我对此真的很迷茫... - mspadaccino
显示剩余2条评论
1个回答

6
你可以通过对索引进行分组并选择第一个条目来进行groupby操作(参见文档):
df.groupby(level=0).first()

例子:

In [1]: df = pd.DataFrame([[1], [2]], index=[1, 1])

In [2]: df
Out[2]: 
   0
1  1
1  2

In [3]: df.groupby(level=0).first()
Out[3]: 
   0
1  1

谢谢Hayden,这样就可以了!显然有一些重复的索引,尽管我很难在数据框中找到它们... 我真的不明白发生了什么... - mspadaccino
7
您可以通过 df.index.get_duplicates() 查看重复的位置 :) - Andy Hayden

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