Pandas v2.1.0+中Series.__getitem__弃用警告的正确写法咨询
Pandas v2.1.0+ 中apply位置索引警告的解决方法
我在使用Pandas v2.1.0+ 版本时遇到问题:需要用自定义函数转换数据框中的一组列,由于新值依赖多列数据,我用apply原地转换列,原代码如下:
my_columns_to_convert = ['col1','col2','col3'] for k in my_columns_to_convert: df[k] = df[[k, colx]].apply(lambda x: convert_my_data(value_1_in=x[0], value_2_in=x[1]), axis=1)
这段代码在旧版Pandas中运行正常,但现在出现如下警告:
FutureWarning: Series.getitem treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use
ser.iloc[pos]
问题原因
警告的核心是:apply的lambda函数中,x是Series对象,用x[0]、x[1]按位置取值的方式在新版Pandas中被标记为废弃。未来版本中,整数索引会被当作列标签而非位置,因此必须明确指定按位置访问。
修正后的代码
直接在lambda里用iloc来按位置获取Series中的值:
my_columns_to_convert = ['col1','col2','col3'] for k in my_columns_to_convert: df[k] = df[[k, colx]].apply(lambda x: convert_my_data(value_1_in=x.iloc[0], value_2_in=x.iloc[1]), axis=1)
更优的替代方案
apply本质是逐行循环,性能较低。如果你的convert_my_data支持向量化输入(比如用numpy操作替代逐元素处理),可以直接传入整列数据,完全避开apply:
my_columns_to_convert = ['col1','col2','col3'] for k in my_columns_to_convert: df[k] = convert_my_data(value_1_in=df[k], value_2_in=df[colx])
这种方式不仅消除了警告,还能大幅提升大数据集的处理速度。
内容的提问来源于stack exchange,提问作者Zach Morris
相关产品推荐
相关产品推荐

