table.remove 删除某些元素,但不是全部
Posted
技术标签:
【中文标题】table.remove 删除某些元素,但不是全部【英文标题】:table.remove removes certain elements but not all 【发布时间】: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。其他词也一样。
我错过了什么?
【问题讨论】:
【参考方案1】:在迭代列表 (for word in row:
) 时,您正在修改列表 (row.remove
)。你可以看到here、here和here,为什么这可能是个问题:
在迭代序列时修改序列可能会由于迭代器的构建方式而导致不良行为。为避免此问题,一个简单的解决方案是遍历列表的副本...使用切片表示法和默认值 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) []
...
...
【讨论】:
以上是关于table.remove 删除某些元素,但不是全部的主要内容,如果未能解决你的问题,请参考以下文章