地图在DatetimeIndex上的行为异常

时间:2019-01-31 13:04:09

标签: python pandas

当应用于DatetimeIndex时,我在map函数上看到一个奇怪的行为,其中映射的第一个元素是整个索引,然后每个元素都按预期方式进行处理。

这是重现问题的一种方法 (已在熊猫0.22.0、0.23.0和0.24.0上尝试过):

df = pd.DataFrame(data = np.random.randn(3,1),
                  index = pd.DatetimeIndex(
                              start='2018-05-03', 
                              periods = 3, 
                              freq ='D'))

df.index.map(lambda x: print(x))

产量:

DatetimeIndex(['2018-05-03', '2018-05-04', '2018-05-05'], dtype='datetime64[ns]', freq='D')
2018-05-03 00:00:00
2018-05-04 00:00:00
2018-05-05 00:00:00
Index([None, None, None], dtype='object')

编辑:打印产生的第一行是我发现的奇怪之处。如果我使用RangeIndex,则不会发生。

1 个答案:

答案 0 :(得分:1)

令人惊讶的打印行为

此异常行为仅影响DatetimeIndex而不影响Series。因此,要修复该错误,请在映射lambda函数之前将索引包裹在pd.Series()中:

pd.Series(df.index).map(lambda x: print(x))

或者,您可以使用.to_series()方法:

df.index.to_series().map(lambda x: print(x))

请注意,pd.Series()版本的返回值将被数字索引,而.to_series()版本的返回值将被日期时间索引。

这是一个错误吗?

Index.map()Series.map()一样,返回一个Series,其中包含lambda函数的返回值。

在这种情况下,print()仅返回None,因此您正确地获得了None值的索引系列。打印行为与其他类型的熊猫索引和系列不一致,但这是一个不寻常的应用。

import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randn(3,1),
              index = pd.DatetimeIndex(
                          start='2018-05-03', 
                          periods = 3, 
                          freq ='D'))

example = df.index.map(lambda x: print(x))
# DatetimeIndex(['2018-05-03', '2018-05-04', '2018-05-05'], dtype='datetime64[ns]', freq='D')
# 2018-05-03 00:00:00
# 2018-05-04 00:00:00
# 2018-05-05 00:00:00
print(example)
# Index([None, None, None], dtype='object')

如您所见,返回值没有任何问题。再举一个更清晰的例子,我们为每个项目添加一天:

example2 = df.index.map(lambda x: x + 1)
print(example2)
# DatetimeIndex(['2018-05-04', '2018-05-05', '2018-05-06'], dtype='datetime64[ns]', freq='D')

因此打印行为与大熊猫中类似的类不一致,但是返回值正确。