我需要清理一个 pandas 数据框,删除重复的信息。例如:
name strength
770 Vitamin B12 Tab 500mcg 500 mcg
771 Vitamin B12 Tab 5mcg 5 mcg
772 Vitamin B12 Tablets 250mcg 250 mcg
773 Vitamin B12-folic Acid None
774 Vitamin B6 & B12 With Folic Acid None
775 Vitamin Deficiency Injectable System - B12 None
776 Vitamine 110 Liq None
777 Vitamine B-12 Tab 100mcg 100 mcg
778 Vitamine B12 25 Mcg - Tablet 25 mcg
779 Vitamine B12 250mcg 250 mcg
我需要从第一个 name 列中删除 strength 中的信息,即:
name strength
770 Vitamin B12 Tab 500 mcg
771 Vitamin B12 Tab 5 mcg
772 Vitamin B12 Tablets 250 mcg
773 Vitamin B12-folic Acid None
774 Vitamin B6 & B12 With Folic Acid None
775 Vitamin Deficiency Injectable System - B12 None
776 Vitamine 110 Liq None
777 Vitamine B-12 Tab 100 mcg
778 Vitamine B12 - Tablet 25 mcg
779 Vitamine B12 250 mcg
请注意,name 中的强度表示可能与 strength 列中的强度不完全对应,直至空格(500 mcg 与 500mcg)
我直接的解决方案是遍历 strength 的所有可能组合,如果在 name 列中有匹配项,则替换为空字符:
new_df = []
for i in df:
for j in df.strength.dropna().drop_duplicates().tolist():
for k in i.split():
if j == k:
new_df.append((i, i.replace(j, '')))
print(new_df)
它确实有效,但是,我有很多数据,这是最非 pythonic 且效率最低的实现方式。
有什么建议吗?
请您参考如下方法:
使用 re 包删除不需要的冗余字符串并将 apply 函数应用于 pandas DataFrame 中的行应该可以完成工作。
在下面的代码中,您可以看到一个可能的解决方案:
import pandas as pd
import re
def removeReduntantData(row):
if row["strength"] is not None:
string = row["strength"].replace(" ", "\s?")
return re.sub(re.compile(string+"\s?", re.IGNORECASE), "", row["name"]).strip()
else:
return row["name"]
df = pd.DataFrame({"name":["Vitamin B12 Tab 500mcg","Vitamin B12 Tab 5mcg","Vitamin B12 Tablets 250mcg","Vitamin B12-folic Acid","Vitamin B6 & B12 With Folic Acid","Vitamin Deficiency Injectable System - B12","Vitamine 110 Liq","Vitamine B-12 Tab 100mcg","Vitamine B12 25 Mcg - Tablet","Vitamine B12 250mcg"],\
"strength":["500 mcg","5 mcg","250 mcg",None,None,None,None,"100 mcg","25 mcg","250 mcg"]})
df["name"] = df.apply(removeReduntantData, axis=1)
输出 DataFrame 是:
>>> df
name strength
0 Vitamin B12 Tab 500 mcg
1 Vitamin B12 Tab 5 mcg
2 Vitamin B12 Tablets 250 mcg
3 Vitamin B12-folic Acid None
4 Vitamin B6 & B12 With Folic Acid None
5 Vitamin Deficiency Injectable System - B12 None
6 Vitamine 110 Liq None
7 Vitamine B-12 Tab 100 mcg
8 Vitamine B12 - Tablet 25 mcg
9 Vitamine B12 250 mcg
通过这种方式,您最终使用 strength 列在 name 列中查找冗余字符串并将其删除,考虑到冗余字符串可能没有之间的空间。
