我有一个来自 csv 文件的 Pandas DataFrame,其索引是日期。
df = pd.read_csv('data.csv', index_col=0, parse_dates=True)
df.index
DatetimeIndex(['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06',
'2010-01-07', '2010-01-08', '2010-01-11', '2010-01-12',
'2010-01-13', '2010-01-14',
...
'2018-06-18', '2018-06-19', '2018-06-20', '2018-06-21',
'2018-06-22', '2018-06-25', '2018-06-26', '2018-06-27',
'2018-06-28', '2018-06-29'],
dtype='datetime64[ns]', name='Date', length=2216, freq=None)
我需要根据每一行的索引号计算值,但 df.index
返回 DatetimeIndex
。如何获取每行的原始索引号系列?
期待:
df.raw_index # return a Series [0, 1, 2, 3, ...]
df['result'] = (df.raw_index + 1) ** 2 ## [1, 4, 9, 16, ...]
我可以使用 pd.Series(range(0, df.shape[0]))
按范围创建系列,但我认为效率不高。
答案 0 :(得分:0)
感谢@anky 的评论和此 answer。我比较了性能:
%timeit df.reset_index().index
549 µs ± 8.52 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit pd.Series(range(0, df.shape[0]))
81 µs ± 1.33 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.arange(result.shape[0])
3.15 µs ± 27 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.arange(len(df))
2.76 µs ± 48.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.arange(len(df.index))
2.51 µs ± 18.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# df.index is well performant, but it returns DatetimeIndex, not raw indexes.
%timeit df.index
127 ns ± 0.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
我仍在寻找更高效/性能更好的方法来获取日期时间索引的 DataFrame 的原始索引系列。