【问题标题】:"ValueError: cannot reindex from a duplicate axis"“ValueError:无法从重复轴重新索引”
【发布时间】:2015-02-26 23:34:45
【问题描述】:

我有以下df:

Timestamp                            A      B      C     ...     
2014-11-09 00:00:00                     NaN     1      NaN   NaN      
2014-11-09 00:00:00                      2     NaN     NaN   NaN             
2014-11-09 00:00:00                     NaN    NaN     3     NaN   
2014-11-09 08:24:00                     NaN    NaN     1     NaN         
2014-11-09 08:24:00                     105    NaN     NaN   NaN           
2014-11-09 09:19:00                     NaN    NaN     23    NaN          

我想做以下几点:

Timestamp                            A      B      C     ...     
2014-11-09 00:00:00                  2      1      3     NaN      
2014-11-09 00:01:00                  NaN    NaN    NaN   NaN
2014-11-09 00:02:00                  NaN    NaN    NaN   NaN
...                                  NaN    NaN    NaN   NaN
2014-11-09 08:23:00                  NaN    NaN    NaN   NaN
2014-11-09 08:24:00                  105    NaN     1    NaN         
2014-11-09 08:25:00                  NaN    NaN     NaN  NaN     
2014-11-09 08:26:00                  NaN    NaN     NaN  NaN
2014-11-09 08:27:00                  NaN    NaN     NaN  NaN      
...                                  NaN    NaN     NaN  NaN      
2014-11-09 09:18:00                  NaN    NaN     NaN  NaN  
2014-11-09 09:19:00                  NaN    NaN     23   NaN      

也就是说:我想合并具有相同时间戳的列(我有 17 列),以 1 分钟的粒度重新采样,对于那些没有值的列,我希望得到 NaN。

我从以下几个方面着手:

df.groupby('Timestamp').sum()

df = df.resample('1Min', how='max')

但我得到以下错误:

ValueError: cannot reindex from a duplicate axis

我该如何解决这个问题?我只是在学习 Python,所以我完全没有经验。

谢谢!

【问题讨论】:

  • 你的时间戳是你的索引吗?

标签: python pandas reindex


【解决方案1】:

假设您将Timestamp 作为索引开始,您需要先进行重新采样,然后在reset_index 进行groupby 之前,这是工作示例:

import pandas as pd

df
                       A   B   C  ...
Timestamp                            
2014-11-09 00:00:00  NaN   1 NaN  NaN
2014-11-09 00:00:00    2 NaN NaN  NaN
2014-11-09 00:00:00  NaN NaN   3  NaN
2014-11-09 08:24:00  NaN NaN   1  NaN
2014-11-09 08:24:00  105 NaN NaN  NaN
2014-11-09 09:19:00  NaN NaN  23  NaN

df.resample('1Min', how='max').reset_index().groupby('Timestamp').sum()

                      A   B   C  ...
Timestamp                           
2014-11-09 00:00:00   2   1   3  NaN
2014-11-09 00:01:00 NaN NaN NaN  NaN
2014-11-09 00:02:00 NaN NaN NaN  NaN
2014-11-09 00:03:00 NaN NaN NaN  NaN
2014-11-09 00:04:00 NaN NaN NaN  NaN
...
2014-11-09 09:17:00 NaN NaN NaN  NaN
2014-11-09 09:18:00 NaN NaN NaN  NaN
2014-11-09 09:19:00 NaN NaN  23  NaN

希望这会有所帮助。

更新:

正如评论中所说,您的“时间戳”不是日期时间,可能是字符串,因此您无法通过 DatetimeIndex 重新采样,只需 reset_index 并将其转换为如下所示:

df = df.reset_index()
df['ts'] = pd.to_datetime(df['Timestamp'])
# 'ts' is now datetime of 'Timestamp', you just need to set it to index
df = df.set_index('ts')
...

现在只需再次运行之前的代码,但将 'Timestamp' 替换为 'ts' 就可以了。

【讨论】:

  • 我仍然有同样的问题,我不明白这是从哪里来的。 :(
  • @Marzia 您遇到的错误意味着您正在尝试对现有索引进行索引。尝试:df = df.reset_index() 然后运行上面的代码,看看是否有帮助
  • 我之前尝试过这样做,当我使用 df.resample('1Min', how='max') 重新采样时,我得到以下信息:TypeError:仅对 DatetimeIndex 或 PeriodIndex 有效,而我没有不知道该怎么做。
  • @Marzia,我猜你的 df['Timestamp'] 是字符串或对象,而不是 DatetimeIndex。你需要转换你的数据,我会更新我的答案
  • 感谢您的更新。不幸的是,我没有帮助:我仍然遇到同样的错误。我不知道该怎么办。 :(
猜你喜欢
  • 2016-05-17
  • 2020-05-23
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多