我有一个数据框,其中一列中包含混合类型值:
df
name ref
a 100
b 103.78
c own
d 108
e abc@yahoo.com
f 110.45
因此ref
col具有混合类型。现在我必须查询它:
d = df[df['ref'] > 105]
# got error can't comapre str() with int
# so i did changed the dtype to float
df['ref'] = df['ref'].astype(float)
# cant convert str to float 'abc@yahoo.com'
在谷歌搜索之后,我现在可以将列值转换为浮动:
# using
df['ref'] = df['ref'].convert_objects(convert_numeric=True)
但是缺点是,它使char
字符串变为Nan
,这在下一个df操作中引起了问题。当然我的查询d = df[df['ref'] > 105]
正在运作。
但是有没有办法在将列值与int进行比较时跳过检查char字符串,反之亦然...这样我的查询就可以工作,char字符串将保持不变。
类似的东西:
d = df[df['ref']>103].skip_charstrings=True
## then i don't have to worry about char or nan or dtype as a whole.
答案 0 :(得分:1)
我认为您可以使用to_numeric
和notnull
:
print df[(pd.to_numeric(df['ref'], errors='coerce').notnull()) & (df['ref']>103)]
name ref
1 b 103.78
3 d 108.00
5 f 110.45
答案 1 :(得分:1)
将df.ref
强制转换为数值,使用gt
获取大于零的布尔值掩码,并显示原始未校正值。
df = pd.DataFrame({'name': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'},
'ref': {0: 100, 1: 103.78, 2: 'own', 3: 108, 4: 'abc@yahoo.com', 5: 110.45}})
>>> df[pd.to_numeric(df.ref, 'coerce').gt(103)]
name ref
1 b 103.78
3 d 108
5 f 110.45
答案 2 :(得分:1)
返回一个可用作掩码的布尔系列,获取所有可以将ref转换为数字的df行。
pd.to_numeric(df.ref,'coerce').notnull()
这还不够,因为列dtype仍然是str。
df[pd.to_numeric(df.ref,'coerce').notnull()].ref > 105
所以你必须在进行比较之前使用astype(int)。
df[pd.to_numeric(df.ref,'coerce').notnull()].ref.astype(int) > 105
这将最终返回你想要的面具。所以这应该有效,不会修改你的字符串值:
d = df[df[pd.to_numeric(df.ref,'coerce').notnull()].ref.astype(int) > 105]