Pandas从索引到系列

时间:2016-07-21 13:20:01

标签: python pandas

这有效:

    s['Date'] = s.index.get_level_values('Date')
    s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s['Date'])

但这不是:

    s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s.index.get_level_values('Date'))

错误是:

pandas/index.pyx in pandas.index.IndexEngine.get_indexer_non_unique (pandas/index.c:6148)()

TypeError: 'NoneType' object is not iterable

是一个带有多索引的Pandas DataFrame。

我最感兴趣的是为什么一个有效而另一个无效。我认为,两者都应该有效。

1 个答案:

答案 0 :(得分:1)

对我而言,添加values以将Series转换为numpy array

s['Expire Days'] = pd.to_datetime(s['Expiration']).values - 
                   s.index.get_level_values('Date')

样品:

import pandas as pd

s = pd.DataFrame({'Expiration': {(pd.Timestamp('2015-03-04 00:00:00'), 1): '2015-03-05', 
                                 (pd.Timestamp('2015-03-03 00:00:00'), 2): '2015-03-05'}})
s = s.rename_axis(['Date','a'])
print (s)
              Expiration
Date       a            
2015-03-03 2  2015-03-05
2015-03-04 1  2015-03-05


s['Expire Days'] = pd.to_datetime(s['Expiration']).values - 
                    s.index.get_level_values('Date')
print (s)
              Expiration  Expire Days
Date       a                         
2015-03-04 1  2015-03-05       1 days
2015-03-03 1  2015-03-05       2 days

通过评论编辑:

s['Date'] = s.index.get_level_values('Date')
s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s['Date'])

工作得很好,因为ndarray的输出Series已转换为Expire Days列中的s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s.index.get_level_values('Date'))

Series

不起作用,pd.to_datetime(s ['Expiration'])是s.index.get_level_values('Date')ndarraypd.to_datetime(s['Expiration']) - s.index.get_level_values('Date').to_series()。所以你需要两个numpy数组或两个系列。

因为错误:

  

“未实现非唯一索引的Index._join_level。”

<{1>}中的

,请将两者都转换为ndarray