从存储在 DataFrame 中的列表中删除项目

Remove items from list stored in DataFrame

我有一个 DataFrame,其中一列包含一些(文本)清理广告,另一列包含对相同广告的一些非常基本的描述。我还将词频以 'keyword':frequency 格式存储在字典中。

任务是从 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 行,“正文”列中的列表可能包含的单词数量从几百到几千不等.将所有数据存储在 pandas df 而不是列表中的原因是我想保留 ID 列,这样我以后可以将我的数据连接到我已经在广告。

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)  [#, #, #]

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