You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对含混合数据类型的DataFrame行执行条件筛选?

解决混合数据类型的列筛选问题

首先,问题核心是Publishing Year列同时包含整数和字符串类型,直接做数值比较会触发类型不兼容的错误。以下是两种适合入门学习者的解决方法:

方法一:转换为数值类型并自动处理无效值

利用pd.to_numeric函数将列转为数值格式,无法转换的字符串会被标记为NaN(缺失值),之后即可正常筛选:

import pandas as pd

already_read = [("Il nome della rosa","Umberto Eco", 1980), 
        ("L'amore che ti meriti","Daria Bignardi", 2014), 
        ("Memorie dal sottsuolo", " Fëdor Dostoevskij", 1864), 
        ("Oblomov", "Ivan Alexandrovich Goncharov ", '/')]

index = range(1,5,1)
data = pd.DataFrame(already_read, columns = ["Books'Title", "Authors", "Publishing Year"], index = index)

# 转换列类型,无效值转为NaN
data['Publishing Year'] = pd.to_numeric(data['Publishing Year'], errors='coerce')

# 筛选年份范围,自动排除NaN行
filtered_data = data[(data['Publishing Year'] >= 1850) & (data['Publishing Year'] <= 1950)]
print(filtered_data)

运行后会保留1864和1980对应的两行,2014超出范围、/转为NaN后均被排除。

方法二:用自定义函数+if语句手动判断

如果你想通过if逻辑手动处理类型判断,可以用apply遍历列值,结合异常捕获过滤有效年份:

import pandas as pd

already_read = [("Il nome della rosa","Umberto Eco", 1980), 
        ("L'amore che ti meriti","Daria Bignardi", 2014), 
        ("Memorie dal sottsuolo", " Fëdor Dostoevskij", 1864), 
        ("Oblomov", "Ivan Alexandrovich Goncharov ", '/')]

index = range(1,5,1)
data = pd.DataFrame(already_read, columns = ["Books'Title", "Authors", "Publishing Year"], index = index)

# 定义判断函数
def check_valid_year(value):
    try:
        year = int(value)
        return 1850 <= year <= 1950
    except:
        return False

# 应用函数筛选行
filtered_data = data[data['Publishing Year'].apply(check_valid_year)]
print(filtered_data)

此方法通过try-except捕获字符串转整数失败的情况,只保留符合条件的有效年份行。

补充说明

  • 方法一是pandas的惯用写法,代码简洁且效率更高,适合处理大规模数据。
  • 方法二更直观,能帮助初学者理解类型判断和异常处理的逻辑。

内容的提问来源于stack exchange,提问作者12666727b9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:54:33