Python Pandas如何修改函数使其根据列值返回两个DataFrame
Pandas自定义函数修改实现
直接通过布尔索引筛选目标行,按顺序返回两个拆分后的DataFrame即可,修改后的完整函数如下:
import pandas as pd def my_func(df, col: str): # 生成目标列是否为NaN的布尔筛选条件 is_nan = pd.isna(df[col]) # 分别筛选两类数据 df_nan = df[is_nan] df_not_nan = df[~is_nan] return df_nan, df_not_nan
细节说明
- 原函数的逻辑问题是直接对整列
df[col]调用pd.isna()做if判断,会返回一个长度和DataFrame行数一致的布尔序列,无法直接作为单值布尔条件使用,逐元素判断生成掩码后做行筛选才是Pandas的标准用法 - 如果你需要拆分后的DataFrame行索引从0重新计数,可以在筛选后追加
.reset_index(drop=True),例如写为df_nan = df[is_nan].reset_index(drop=True),输出效果会和你给出的样例完全匹配 - 函数调用方式和预期完全一致,直接用两个变量按顺序接收返回值即可:
df_nan, df_not_nan = my_func(df=my_df, col="col1")
效果验证
用你提供的样例数据测试:
import numpy as np # 构造测试样例 my_df = pd.DataFrame({"col1": [np.nan, "ABC", np.nan]}) df_nan, df_not_nan = my_func(my_df, col="col1")
未加索引重置时,df_nan输出为:
col1 0 NaN 2 NaN
df_not_nan输出为:
col1 1 ABC
加了reset_index(drop=True)后,两个结果的行索引都会重置为从0开始的连续序号,和你给出的预期样例完全一致。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

