当应用于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,则不会发生。
答案 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')
因此打印行为与大熊猫中类似的类不一致,但是返回值正确。