我正试图用.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) []
...
...