【问题标题】:Remove items from list stored in DataFrame从存储在 DataFrame 中的列表中删除项目
【发布时间】:2021-11-12 20:24:05
【问题描述】:

我有一个 DataFrame,它在一列中包含一些(文本)清理过的广告,在另一列中包含对相同广告的一些非常基本的描述。我还将术语频率以“关键字”:频率格式存储在字典中。

任务是从df 中的列表中清除低于某个频率截止点水平的所有术语。

import pandas as pd

adset = {"ID": ["(1483785165, 2009)", "(1538280431, 2010)", "(1795044103, 2010)"],
        "Body":[['price', '#', 'bedrooms', '#', 'bathrooms', '#', 'garage'],['cindy', 'lavender', 'mid', 'state', 'realty'],['upgrades', 'galore', 'perfectly', 'maintained', 'home', 'formals']]}

df = pd.DataFrame(adset)

keyword_dict={}
for row in data['Body']:
    for word in row:
        if word in keyword_dict:
            keyword_dict[word]+=1
        else:
            keyword_dict[word]=1

这就是我卡住的地方:

def remove_sparse_words_from_df(df, term_freq, cutoff=1):
    for row in df['Body']:
        for word in row:
            if term_freq[word]<=cutoff:
    
    return df

我的整个方法可能会失败 - 性能是一个大问题,df 有大约 350k 行,“Body”列中的列表可能包含从几百到几千不等的单词。将所有数据存储在 pandas df 而不是列表中的原因是我想保留 ID 列,以便以后可以将我的数据连接到我已经对广告进行的其他一些分析。

【问题讨论】:

    标签: python pandas list nlp


    【解决方案1】:

    IIUC,试试:

    1. 使用explode 将列表拆分为单独的行
    2. groupbytransform 获取数据框中关键字的计数,并仅保留“计数”大于截止值的行
    3. groupbyagg 获取原始DataFrame结构。
    cutoff = 1
    
    df = df.explode("Body")
    output = df.loc[df.groupby("Body")["ID"].transform("size").gt(1)].groupby("ID").agg(list)
    
    >>> output
                             Body
    ID                           
    (1483785165, 2009)  [#, #, #]
    

    注意:在您的示例中,“#”是唯一出现多次的“单词”。

    【讨论】:

    • 嗨!非常感谢您的回答,我不能完全理解发生了什么,但这可能只意味着有很多东西要学:) 在这个例子中,你的代码似乎在我的 df 上运行良好,但不是在真实的 :|代码运行但即使我将 gt(1) 更改为 gt(10) 也会保持数据库完好无损。在上面的例子中,我尽力完美地模仿了我的数据,似乎我失败了。你能看看我使用的一些真实数据吗?我似乎看不出有什么区别...pastebin.com/g25bHCC7
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2019-11-26
    • 1970-01-01
    • 2016-05-08
    • 2011-03-18
    相关资源
    最近更新 更多