比较数据框列和字符串和数字

时间:2019-01-24 16:25:04

标签: python pandas

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

示例数据:

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 个答案:

答案 0 :(得分:7)

object dtype系列可以容纳任何东西

问题是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)

答案 1 :(得分:1)

使用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