鉴于这种情况,我不明白为什么要提出这个特殊警告。 将函数应用于数字系列时,它会引发“FutureWarning:设置不兼容 dtype 的项目已被弃用,并将在 pandas 的未来版本中引发错误。值 '[0 1 1 ... 1 0 0]' 具有 dtype与 int32 不兼容,请先显式转换为兼容的数据类型。"
这是正在应用的函数:
def rush_hourizer(hour):
if 6 <= hour['rush_hour'] < 10:
val = 1
elif 16 <= hour['rush_hour'] < 20:
val = 1
else:
val = 0
return val
这是存储的数据类型和数据:
print(df1['rush_hour'].dtype)
print(df1['rush_hour'].unique())
int32
[ 0 14 7 19 17 15 23 6 13 18 12 20 10 21 11 8 2 16 9 22 1 5 4 3]
所以当我运行时:
df1.loc[(df1.day != 'saturday') & (df1.day != 'sunday'), 'rush_hour'] = df1.apply(rush_hourizer, axis=1)
我收到提到了设置不兼容的数据类型的 FutureWarning。 鉴于我正在应用一个数值,我不明白为什么会出现此消息。 我缺少什么?
警告信息告诉你,你虽然在处理数值数据,但试图将一个 NumPy 数组直接赋值给 Pandas Series 的一个切片,而这个数组的数据类型与 Series 不兼容。虽然你的函数返回数值(0 或 1),但
df1.apply(rush_hourizer, axis=1)
返回的是一个 NumPy 数组,默认类型为 int64,而你的
df1['rush_hour']
列的类型是 int32。
为了解决这个问题,你可以在应用函数后将结果转换为 int32 类型:
df1.loc[(df1.day != 'saturday') & (df1.day != 'sunday'), 'rush_hour'] = df1.apply(rush_hourizer, axis=1).astype('int32')
或者,更有效率的做法是使用 Pandas 内置的向量化操作来避免使用 apply 函数:
df1.loc[(df1.day != 'saturday') & (df1.day != 'sunday'), 'rush_hour'] = (
((df1['rush_hour'] >= 6) & (df1['rush_hour'] < 10)) |
((df1['rush_hour'] >= 16) & (df1['rush_hour'] < 20))
).astype(int)
这段代码直接在 DataFrame 上进行逻辑运算,并将结果转换为整数类型,避免了数据类型不匹配的问题,同时也更加简洁高效。
标签:python,pandas From: 78799996