有很多类似的问题,但我找不到解决问题的方法。我有一个具有以下结构/形式的数据框:
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])
,但它只能用于比较整个单元格,无论它是否为数字。
你有一些想法怎么做?或者也许用空格打破列然后进行比较会很好?
答案 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
添加另一个','