在pandas

时间:2017-07-25 18:32:17

标签: python string pandas dataframe

我有一个DataFrame,如下所示

url1, labela:0.5
url2, labelb:0.4
url3, labelc:0.7

我试图执行以下操作,将标签列拆分为':'并按数值过滤,例如大于0.6。在上面的例子中,使用url1和url2过滤掉行,因为值分别为0.5和0.4。

我做了以下但是这不起作用:

df = df[df["labels"].str.split(':').get(1).astype('float') >= 0.6]

我想发生的事情是get(1)会在分割后给我第二行而不是我想象中的第二列。我也尝试了一些这方面的变化,但没有奏效。我希望这可以说明我的想法。这样做会有什么优雅的方式?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用df.str.split(..., expand=True),然后使用df.astypeboolean indexing进行类型转换:

In [782]: df[df['labels'].str.split(':', expand=True)[1].astype(float) >= 0.6]
Out[782]: 
    url       labels
2  url3   labelc:0.7

答案 1 :(得分:2)

关于类似方法的很长的方式......
numpy有一个字符串操作模块np.core.defchararray,我们在字符串访问器pd.Series.str下找到了许多相同的函数

除了我的想象之外,我选择使用rsplit除了我想象的可能有多个':'并且只想分开最后一个之后没有其他正当理由。

splits = np.core.defchararray.rsplit(df['labels'].values.astype(str), ':', 1)
df[np.array([x[1] for x in splits], dtype=float) >= .6]

   urls       labels
2  url3   labelc:0.7