代码之家  ›  专栏  ›  技术社区  ›  Dread

将数据帧列与字符串和数字进行比较

  •  1
  • Dread  · 技术社区  · 6 年前

    我有一个数据框架,有两列,其中有字符串和数字。当我比较这两列时,它们不匹配,即使它们看起来是相同的。

    实例数据:

    old_code     new_code
    100000       100000
    

    当我比较时,结果是错误的:

    df['old_code'] == df['new_code']
    0    False
    dtype: bool
    

    数据类型相同:

    df.dtypes
    old_code    object
    new_code    object
    dtype: object
    

    我尝试剥离列以防出现空白,但它们仍然不匹配:

    df['old_code'].str.strip() == df['new_code'].str.strip() 
    0    False
    dtype: bool
    

    我把这个数据框架编进了一本字典,想看看是否能发现任何错误,我注意到出于某种原因,其中一列的格式是字符串,另一列的格式是整数:

    d = df.to_dict()
    d
    {'old_code': {0: '100000'}, 'new_code': {0: 100000}}
    

    关于如何比较这些列有什么建议吗?我不想将数据类型更改为整数,因为有些行是真正的字符串。

    2 回复  |  直到 6 年前
        1
  •  7
  •   jpp    6 年前

    object DTYPE系列可以容纳任何内容

    问题是 对象 数据类型系列包含 任意的 python对象。在这里,您的序列中有一个字符串,另一个有一个整数:

    df = pd.DataFrame({'old_code': ['100000'], 'new_code': [100000]}, dtype=object)
    
    print(df.dtypes)
    # new_code    object
    # old_code    object
    # dtype: object
    
    print(type(df['old_code'].iat[0]))
    # <class 'str'>
    
    print(type(df['new_code'].iat[0]))
    # <class 'int'>
    

    因此,要始终如一。将两者转换为数字 两者都是字符串。

    转换为数字

    cols = ['old_code', 'new_code']
    df[cols] = df[cols].apply(pd.to_numeric)
    

    转换为字符串

    df[cols] = df[cols].apply(lambda s: s.astype(str))
    

    不修改数据帧

    严格来说,你不会 需要 更新数据帧。为了进行比较,您只能对每个系列进行强制转换:

    # numeric comparison
    pd.to_numeric(df['old_code']) == pd.to_numeric(df['new_code'])
    
    # string comparison
    df['old_code'].astype(str) == df['new_code'].astype(str)
    
        2
  •  1
  •   Karn Kumar    6 年前

    使用numpy怎么样:

    转换为int:

    >>> import numpy as np
    >>> df['old_code'].astype(dtype=np.int64)
    0    100000
    Name: old_code, dtype: int64
    

    转换为浮动:

    >>> df['old_code'].astype(dtype=np.float64)
    0    100000.0
    Name: old_code, dtype: float64
    

    转换为字符串:

    >>> df['old_code'].astype(dtype=np.str)
    0    100000
    Name: old_code, dtype: object
    

    DataFrame.apply() 可用于 pd.to_numeric

    >>> df.apply(pd.to_numeric, errors='coerce')
       old_code  new_code
    0    100000    100000