跳过char字符串值,同时将混合类型的列值与int或float在pandas Dataframe中进行比较

时间:2016-02-04 18:32:17

标签: python pandas

我有一个数据框,其中一列中包含混合类型值:

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.

3 个答案:

答案 0 :(得分:1)

我认为您可以使用to_numericnotnull

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]