table.remove删除某些元素,但不是全部



我正试图用.remove()从列表中删除元素(列表存储在pandas数据帧中(。基本思想是,我遍历数据帧中的所有行,然后遍历行(=list(中的每个元素,并检查该特定元素是keeper还是"keeper";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函数删除了一些低于截止值的单词,但不是全部。示例:单词";"干净";在原始数据帧(数据(中出现约10k,运行remove_sparse_words_from_df后仍保留约2k。其他词语也是如此。

我错过了什么?

您正在修改列表(row.remove(,同时对其进行迭代(for word in row:(。你可以看到这里,这里和这里,为什么这可能是一个问题:

由于迭代器的构建方式,在迭代序列时修改序列可能会导致不期望的行为。为了避免这个问题,一个简单的解决方案是迭代列表的副本。。。使用具有默认值的切片表示法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)   []
...
...