【发布时间】:2020-12-14 17:45:05
【问题描述】:
我正在为一个项目将一个大的 .csv 文件导入 pandas。数据框中的一列最终包含 4 列连接数据(我无法控制收到的数据)、品牌名称(我要删除的内容)、产品描述、产品尺寸和 UPC。请注意,Item_UPC 中的品牌描述并不总是 == 品牌。
例如
import pandas as pd
df = pd.DataFrame({'Item_UPC': ['fubar baz dr frm prob onc dly wmn ogc 30vcp 06580-66-832',
'xxx stuff coll tides 20 oz 09980-66-832',
'hel world sambucus elder 60 chw 0392-67-491',
'northern cold ultimate 180 sg 06580-66-832',
'ancient nuts boogs 16oz 58532-42-123 '],
'Brand': ['FUBAR OF BAZ',
'XXX STUFF',
'HELLO WORLD',
'NORTHERN COLDNITES',
'ANCIENT NUTS']})
我想从Item_UPC 列中删除品牌名称,因为这是其他问题中的多余信息。目前我有一个函数,它获取新的 df 并拉出 UPC 并清理它以匹配在瓶子上找到的内容和我为单个品牌拥有的另一个数据库,减去最后一个校验和数字。
def clean_upc(df):
#take in a dataframe, expand the number of columns into a temp
#dataframe
temp = df["Item_UPC"].str.rsplit(" ", n=1, expand = True)
#add columns to main dataframe from Temp
df.insert(0, "UPC", temp[1])
df.insert(1, "Item", temp[0])
#drop original combined column
df.drop(columns= ["Item_UPC"], inplace=True)
#remove leading zero on and hyphens in UPC.
df["UPC"]= df["UPC"].apply(lambda x : x[1:] if x.startswith("0") else x)
df["UPC"]=df["UPC"].apply(lambda x :x.replace('-', ''))
col_names = df.columns
#make all columns lower case to ease searching
for cols in col_names:
df[cols] = df[cols].apply(lambda x: x.lower() if type(x) == str else x)
运行后,我有一个包含三列的数据框
UPC, Item, Brand
数据框中有超过 30 万行和 2300 个独特品牌。他们也没有一致的方式来缩短名称。当我运行以下代码时
temp = df["Item"].str.rsplit(" ", expand = True)
temp 的形状为
temp.shape
(329868, 13)
当第 9-13 列的大部分内容为空时,手动管理会很痛苦。 目前我的逻辑是首先将品牌拆分为 2,同时将第一列放入 temp
brand = df["brand"].str.rsplit(" ", n=1,expand = True) #produce a dataframe of two columns
temp.drop(columns= [0], inplace=True)
然后在 temp[1] 上进行字符串替换,以查看它是否在品牌 [1] 中包含正则表达式,然后将其替换为 " " 或反之亦然,然后将 temp 重新连接在一起(
temp["combined"] = temp[1] + temp[2]....+temp[13]
并用combined 列替换现有的Item 列
df["Item"] = temp["combined"]
或者有更好的方法吗?有很多品牌只有一个名字,这可能会让一切变得更快。我一直在用正则表达式苦苦挣扎,从逻辑上讲,这似乎会更快,我只是很难思考使它起作用的语法。
【问题讨论】:
-
你能澄清你的确切问题吗?是否有您正在寻找的解决方案或您希望优化的行为?
-
例如,我想将最后一行“古代坚果 boogs 16oz 58532-42-123”更改为“boogs 16oz”。我的移除和清洁 UPC 的功能运行良好,但我不知道如何从该行或任何其他品牌名称中移除“古代坚果”。
标签: python-3.x regex pandas string