在Python中从字符串中删除独立数字

时间:2017-11-13 17:20:20

标签: python pandas numpy

有很多类似的问题,但我找不到解决问题的方法。我有一个具有以下结构/形式的数据框:

   col_1
0  BULKA TARTA 500G KAJO 1
1  CUKIER KRYSZTAL 1KG KSC 4
2  KASZA JĘCZMIENNA 4*100G 2 0.92
3  LEWIATAN MAKARON WSTĄŻKA 1 0.89

但是,我希望达到这个效果:

   col_1
0  BULKA TARTA 500G KAJO
1  CUKIER KRYSZTAL 1KG KSC
2  KASZA JĘCZMIENNA 4*100G
3  LEWIATAN MAKARON WSTĄŻKA

所以我想删除独立的自然和十进制数字,但是将数字保留在字符串中。

我尝试使用df.col_1.str.isdigit().replace([True, False],[np.nan, df.col_1]),但它只能用于比较整个单元格,无论它是否为数字。

你有一些想法怎么做?或者也许用空格打破列然后进行比较会很好?

3 个答案:

答案 0 :(得分:1)

当然,

你可以使用正则表达式。

import re
df.col_1 = re.sub("\d+\.?\d+?", "",  df.col_1)

答案 1 :(得分:1)

我们可以创建一个尝试转换为float的函数。如果失败,我们返回True(not_float)

import pandas as pd

df = pd.DataFrame({"col_1" : ["BULKA TARTA 500G KAJO 1",
                              "CUKIER KRYSZTAL 1KG KSC 4",
                              "KASZA JĘCZMIENNA 4*100G 2 0.92",
                              "LEWIATAN MAKARON WSTĄŻKA 1 0.89"]})

def is_not_float(string):
    try:
        float(string)
        return False
    except ValueError:  # String is not a number
        return True

df["col_1"] = df["col_1"].apply(lambda x: [i for i in x.split(" ") if is_not_float(i)])

df

或者以我的同伴SO的例子为例。然而,这会将130.视为一个数字。

df["col_1"] = (df["col_1"].apply(
    lambda x: [i for i in x.split(" ") if not i.replace(".","").isnumeric()]))

返回

                          col_1
0    [BULKA, TARTA, 500G, KAJO]
1  [CUKIER, KRYSZTAL, 1KG, KSC]
2   [KASZA, JĘCZMIENNA, 4*100G]
3  [LEWIATAN, MAKARON, WSTĄŻKA]

答案 2 :(得分:0)

是的,你可以

def no_nums(col):
    return ' '.join(filter(lambda word:word.replace('.','').isdigit()==False, col.split()))
df.col_1.apply(no_nums)

这会过滤掉每个值中完全由数字组成的单词,
并且可能包含小数点 如果您要过滤掉1,000之类的数字,只需为replace添加另一个','