如何从Pandas DataFrame中剔除C1或C4列含字符串的行?
问题描述
我有如下DataFrame:
| C1 | C2 | C3 | C4 |
|---|---|---|---|
| 1 | foo | asd | 23 |
| foo | foo | asd | 43 |
| 3 | foo | asd | 1 |
| 4 | foo | asd | bar |
希望过滤并剔除所有C1或C4列中包含字符串的行,最终得到:
| C1 | C2 | C3 | C4 |
|---|---|---|---|
| 1 | foo | asd | 23 |
| 3 | foo | asd | 1 |
我尝试用isNaN实现,但不确定用法,现有代码如下:
df = pd.read_csv( path_file, sep=",", usecols=columns, skiprows=0, skipfooter=0, engine="python", encoding="utf-8", skipinitialspace=True, on_bad_lines='warn', names=columns) df_new = df[df["C1"].notna()] df_new_2 = df[df["C4"].notna()]
解决方案
你的问题不是处理空值(NaN),而是要筛选出C1和C4列均为有效数值的行。可以通过pd.to_numeric配合errors='coerce'将非数值内容转为NaN,再用notna()过滤:
# 标记C1列中可转为数值的行 valid_c1 = pd.to_numeric(df['C1'], errors='coerce').notna() # 标记C4列中可转为数值的行 valid_c4 = pd.to_numeric(df['C4'], errors='coerce').notna() # 保留同时满足两列都为有效数值的行 df_filtered = df[valid_c1 & valid_c4]
也可以合并为一行代码:
df_filtered = df[pd.to_numeric(df['C1'], errors='coerce').notna() & pd.to_numeric(df['C4'], errors='coerce').notna()]
关键逻辑说明
pd.to_numeric(..., errors='coerce'):尝试将列转为数值类型,无法转换的字符串会被强制转为NaN.notna():筛选出非NaN的行,即原列中为有效数值的行&:逻辑与运算符,只有同时满足C1和C4均为有效数值的行才会被保留
内容的提问来源于stack exchange,提问作者Step
相关产品推荐
相关产品推荐

