这有效:
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。
我最感兴趣的是为什么一个有效而另一个无效。我认为,两者都应该有效。
答案 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')
而ndarray
是pd.to_datetime(s['Expiration']) - s.index.get_level_values('Date').to_series()
。所以你需要两个numpy数组或两个系列。
因为错误:
<{1>}中的“未实现非唯一索引的Index._join_level。”
,请将两者都转换为ndarray
。