【问题标题】:table.remove removes certain elements but not alltable.remove 删除某些元素,但不是全部
【发布时间】:2021-12-26 05:09:03
【问题描述】:

我正在尝试使用.remove() 从列表中删除元素(列表存储在熊猫数据框中)。基本思想是,我遍历数据框中的所有行,然后遍历行中的每个元素(=list),并检查该特定元素是保持器还是“goner”

data=dict()
data=pd.read_csv('raw_output_v2.csv', names=['ID','Body'])
data['Body']=data['Body'].apply(eval)  
keyword_dict={}
for row in tqdm(data['Body'], desc="building dict"):
    for word in row:
        if word in keyword_dict:
            keyword_dict[word]+=1
        else:
            keyword_dict[word]=1 

new_df=remove_sparse_words_from_df(data, keyword_dict, cutoff=1_000_000)

这里是重要的东西:

def remove_sparse_words_from_df(df, term_freq, cutoff=1):
    i=0
    for row in tqdm(df['Body'],desc="cleaning df"):
        for word in row:
            if term_freq[word]<=cutoff:
                row.remove(word)
            else:
                continue
    return df

我上传了一个简短的 csv 示例供此处使用:https://pastebin.com/g25bHCC7

我的问题是:remove_sparse_words_from_df 函数删除了一些低于截止值的单词,但不是全部。示例:在运行remove_sparse_words_from_df 之后,原始数据帧(数据)中出现了大约 10k 的单词“clean”,仍然存在大约 2k。其他词也一样。

我错过了什么?

【问题讨论】:

    标签: python pandas list nlp


    【解决方案1】:

    在迭代列表 (for word in row:) 时,您正在修改列表 (row.remove)。你可以看到hereherehere,为什么这可能是个问题:

    在迭代序列时修改序列可能会由于迭代器的构建方式而导致不良行为。为避免此问题,一个简单的解决方案是遍历列表的副本...使用切片表示法和默认值 list_1[:]

        ...
        for row in tqdm(df['Body'],desc="cleaning df"):
            for word in row[:]:
                if term_freq[word]<=cutoff:
                    row.remove(word)
        ...
    

    截止设置为 1_000_000

                       ID Body
    0  (1483785165, 2009)   []
    1  (1538280431, 2010)   []
    2  (1795044103, 2010)   []
    ...
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 2021-10-06
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多