web-dev-qa-db-ja.com

「ValueError:重複する軸からインデックスを再作成できません」

私は次の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を学んでいるだけなので、まったく経験がありません。

ありがとうございました!

7
Marzia

そもそもインデックスとしてTimestampがあると仮定すると、最初にリサンプリングを実行する必要があり、次にreset_indexgroupbyを実行する前に、作業サンプルを次に示します。

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」に置き換えれば、問題ないはずです。

6
Anzel