记录DataFrame执行apply,想实现数据加工并过滤时,遇到的问题和解决方法

先描述一下遇到问题

在对DataFrame数据进行处理的过程中,突然发现执行某个apply时,返回结果变成了Series

查找原因

在使用apply时,调用了函数f()来处理拆分出来的每一条Series;

def f(s):
    ...
    if ...==True:
    	return s
    	
df_attr = df_temp.apply(f, axis=1)

然后发现f()中只有True的时候才return,应该是想在处理数据的同时,过滤掉一些数据;
想法不错,但是apply不是这么用的,apply对每一项进行处理的时候,是输入输出一一映射的关系,丢失了一些输出,将导致无法将处理结果重新拼回DataFrame形式,最终输出结果变成了Series类型。

解决问题

方法1(可行, 但会导致dtype变动)

补全f(),要想过滤的,构造空行代替
最后去除空行

def f(s):
    ...
    if ...==True:
    	return s
    else:
    	return pd.Series(index=series.index) # 回传空的series
    	
df_attr = df_temp.apply(f, axis=1).dropna(axis=0, how='all', inplace=False) # 然后剔除空行即可

发现该方法会导致dtype发生变动
DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.

方法2

最后还是用下方的方法

def f(s): 
    ...
    if ...==True:
        s['c']=None # 将其中某列的值,加上删除标记,比如将该值设置为None或-1.0等不可能出现的值,以便后续过滤
    return s

# 执行,并删除空行
df1 = df.apply(f, axis=1)
df2 = df1[df1['c'].notnull()] # 过滤掉要删除的行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值