先描述一下遇到问题
在对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()] # 过滤掉要删除的行