Skip to main content
 首页 » 编程设计

python之从 Pandas 中删除列中的重复信息

2025年05月04日21qlqwjy

我需要清理一个 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 列中查找冗余字符串并将其删除,考虑到冗余字符串可能没有之间的空间。