对空的DataFrame使用apply方法未得到预期结果
一、问题及原因
阿猪希望使用Pandas的apply方法对原先的DataFrame进行运算从而得到一个新的DataFrame,新的DataFrame与原先的DataFrame拥有不同的列。
1 | import pandas |
上边的示例代码是一个简化后的原型,它会创建一个新的DataFramedf_new
,拥有两个新的列d
和e
,其中d
列与原DataFramedf
的a
列相同,e
列则由df
的b
列和c
相加而得。
当df不为空时,可以得到预期的结果:
1 | d e |
但是当将df的值改为pandas.DataFrame(columns = ['a', 'b', 'c'])
时(即定义了列的空DataFrame),运行代码后返回的结果并不是预期的
Empty DataFrame
Columns: [d, e]
Index: []
而是直接返回了df的值:
Empty DataFrame
Columns: [a, b, c]
Index: []
经过网上一番搜索和调试,原来问题出在apply方法处理空DataFrame的逻辑上。当对df使用apply方法时,Pandas会调用pandas.core.apply.frame_apply
。
1 | class FrameApply(NDFrameApply): |
这里会对df的行和列进行检查。如果df的行或/和列为空,则不会继续运行后续的代码,而是直接返回apply_empty_result
的结果。
1 | class FrameApply(NDFrameApply): |
在apply_empty_result
中,如果apply的result_type参数的值不是reduce
或者默认值None
,则会直接复制df并返回,从而导致运行示例代码后直接返回了df的值。
二、解决方法
1、在使用apply方法之前进行条件判断
示例代码如下:
1 | if len(df) == 0: |
2、在返回的结果中修改列索引
示例代码如下:
1 | df_new = df.apply(func, axis=1) |
未经书面授权许可,任何个人和组织不得以任何形式转载、引用本站的任何内容。本站保留追究侵权者法律责任的权利。
评论