【问题标题】:Python dtype('O') . Processing object data type. Converting to string/integerPython dtype('O') 。处理对象数据类型。转换为字符串/整数
【发布时间】:2018-09-05 15:19:16
【问题描述】:

我有来自 ImDB 的演员表。

从该表中,我想删除 imdb_actors.birthYear 缺失或小于 1950 的所有行,并删除 imdb_actors.deathYear 具有一定价值的行。

我们的想法是获取一个包含活着且未退休的演员的数据集。

imdb_actors.birthYear.dtype
Out:dtype('O')

而且我无法转换为字符串,这无济于事:imdb_actors['birthYear'] = imdb_actors['birthYear'].astype('|S')。它只是毁了所有岁月。

这就是我无法执行的原因:imdb_actors[imdb_actors.birthYear >= 1955] 当我尝试imdb_actors.birthYear.astype(str).astype(int) 时,我收到消息:ValueError: invalid literal for int() with base 10: '\\N'

删除缺失并应用 >= 1950 条件的方法是什么?

【问题讨论】:

    标签: python pandas dataframe object-type


    【解决方案1】:

    首先将数值数据转换为数值系列:

    num_cols = ['birthYear', 'deathYear']
    df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce')
    

    指定errors='coerce' 将不可转换的元素强制为NaN

    然后为您的 3 个条件创建掩码,通过矢量化 |“或”运算符组合,通过 ~ 否定,并在您的数据帧上应用布尔索引:

    m1 = df['birthYear'].isnull()
    m2 = df['birthYear'] < 1950
    m3 = df['deathYear'].notnull()
    
    res = df[~(m1 | m2 | m3)]
    

    【讨论】:

    • df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce') 多年来丢失了良好的单元格,只是将每一列返回为 NaN。
    • 我很想看看这个,但我无法将您在问题上发布的图像复制粘贴到我的代码中。另请参阅How to make good reproducible pandas examples
    【解决方案2】:

    您的问题是您的birthYear 系列的类型是 Object,它适用于字符串或混合类型。

    您需要先通过应用这样的函数来清理这个系列:

    imdb_actors.birthYear = imdb_actors.birthYear.map(lambda x: int(x) if str(x) != '\\N' else pd.np.nan)
    

    然后你就可以进行过滤了:

    imdb_actors[imdb_actors.birthYear >= 1955]
    

    【讨论】:

    • 尝试运行第一行时出现错误:ValueError: invalid literal for int() with base 10: b'\\N'
    • 您可以发布您的数据样本吗?
    • 您应该使用矢量化操作。 map + lambda on object dtype 并不比带有 list 的简单循环更好。
    • 我在将表格转换为 SO 上的好格式时遇到了很大的麻烦。有没有办法很好地粘贴它?对不起,愚蠢的问题。
    • @Pinkythemouse,这是个好问题。请参阅此问题以获取答案:How to make good reproducible pandas examples
    猜你喜欢
    • 2023-03-09
    • 2014-04-03
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多