从 pandas 列的字符串列表中删除数字
Remove digits from a list of strings in pandas column
我有这个 pandas 数据框
0 Tokens
1: 'rice', 'XXX', '250g'
2: 'beer', 'XXX', '750cc'
此处的所有标记,'rice'、'XXX'和'250g'都在同一个字符串列表中,也在同一列中
我想删除数字,因为它换句话说,
无法删除数字。
我试过这个代码:
def remove_digits(tokens):
"""
Remove digits from a string
"""
return [''.join([i for i in tokens if not i.isdigit()])]
df["Tokens"] = df.Tokens.apply(remove_digits)
df.head()
但它只是加入了字符串,我显然不想这样做。
我想要的输出:
0 Tokens
1: 'rice' 'XXX' 'g'
2: 'beer', 'XXX', 'cc'
这是一个简单的解决方案 -
df = pd.DataFrame({'Tokens':[['rice', 'XXX', '250g'],
['beer', 'XXX', '750cc']]})
def remove_digits_from_string(s):
return ''.join([x for x in s if not x.isdigit()])
def remove_digits(l):
return [remove_digits_from_string(s) for s in l]
df["Tokens"] = df.Tokens.apply(remove_digits)
这可以使用 pandas 方法实现,这些方法经过矢量化处理比循环更有效。
import pandas as pd
df = pd.DataFrame({"Tokens": [["rice", "XXX", "250g"], ["beer", "XXX", "750cc"]]})
col = "Tokens"
df[col] = (
df[col]
.explode()
.str.replace("\d+", "", regex=True)
.groupby(level=0)
.agg(list)
)
# Tokens
# 0 [rice, XXX, g]
# 1 [beer, XXX, cc]
这里我们使用:
pandas.Series.explode
将列表系列转换为行
pandas.Series.str.replace
将出现的 \d
(数字 0-9)替换为 ""
(无)
pandas.Series.groupby
按索引对系列进行分组 (level=0
) 并将它们放回列表 (.agg(list)
)
您可以使用 to_list
+ re.sub
来更新您的原始数据框。
import re
for index, lst in enumerate(df['Tokens'].to_list()):
lst = [re.sub('\d+', '', i) for i in lst]
df.loc[index, 'Tokens'] = lst
print(df)
输出:
Tokens
0 [rice, XXX, g]
1 [beer, XXX, cc]
我有这个 pandas 数据框
0 Tokens
1: 'rice', 'XXX', '250g'
2: 'beer', 'XXX', '750cc'
此处的所有标记,'rice'、'XXX'和'250g'都在同一个字符串列表中,也在同一列中
我想删除数字,因为它换句话说, 无法删除数字。
我试过这个代码:
def remove_digits(tokens):
"""
Remove digits from a string
"""
return [''.join([i for i in tokens if not i.isdigit()])]
df["Tokens"] = df.Tokens.apply(remove_digits)
df.head()
但它只是加入了字符串,我显然不想这样做。
我想要的输出:
0 Tokens
1: 'rice' 'XXX' 'g'
2: 'beer', 'XXX', 'cc'
这是一个简单的解决方案 -
df = pd.DataFrame({'Tokens':[['rice', 'XXX', '250g'],
['beer', 'XXX', '750cc']]})
def remove_digits_from_string(s):
return ''.join([x for x in s if not x.isdigit()])
def remove_digits(l):
return [remove_digits_from_string(s) for s in l]
df["Tokens"] = df.Tokens.apply(remove_digits)
这可以使用 pandas 方法实现,这些方法经过矢量化处理比循环更有效。
import pandas as pd
df = pd.DataFrame({"Tokens": [["rice", "XXX", "250g"], ["beer", "XXX", "750cc"]]})
col = "Tokens"
df[col] = (
df[col]
.explode()
.str.replace("\d+", "", regex=True)
.groupby(level=0)
.agg(list)
)
# Tokens
# 0 [rice, XXX, g]
# 1 [beer, XXX, cc]
这里我们使用:
pandas.Series.explode
将列表系列转换为行pandas.Series.str.replace
将出现的\d
(数字 0-9)替换为""
(无)pandas.Series.groupby
按索引对系列进行分组 (level=0
) 并将它们放回列表 (.agg(list)
)
您可以使用 to_list
+ re.sub
来更新您的原始数据框。
import re
for index, lst in enumerate(df['Tokens'].to_list()):
lst = [re.sub('\d+', '', i) for i in lst]
df.loc[index, 'Tokens'] = lst
print(df)
输出:
Tokens
0 [rice, XXX, g]
1 [beer, XXX, cc]