循环更改行甚至没有循环的数据?

时间:2017-02-09 20:36:09

标签: python loops pandas

我有一个vocabulary,这是一个单词列表。我的数据框posts有两列,wordswordsdictcoded。第一个包含像['this', 'is']这样的单词列表。词汇表包含words列中显示的所有单词。 wordsdictcoded列应包含已编码的字词。编码的工作方式如下:每个单词由词汇表长度中的0和1数组表示。 words列由词汇表编码:如果words第n个单词是词汇表中的第i个,则编码的第i个元素将为1。 的Fe:

vocabulary = ['this', 'is' 'a', 'test']
words[i] = ['a', 'test']
wordsdictcoded[i] = [0, 0, 1, 1]

这就是我想要实现的目标。我的代码是:

listofzeros = [0] * len(vocabulary)
posts['wordsdictcoded'] = [listofzeros] * len(posts)
for i in range(0, len(posts)):
    for word in posts['words'][i]:
        posts['wordsdictcoded'][i][vocabulary.index(word)] = 1

但是,对于每一行帖子而言,我最终都会获得所有1个字词[' wordsdictcoded']。我不明白。如果我只运行range(0,1)的循环,即使print(posts['wordsdictcoded'][5]获取值,所有行都会得到值。为什么呢?

2 个答案:

答案 0 :(得分:2)

这是一个常见的python问题。问题是[listofzeros] * len(posts)复制相同的列表len次,它不会创建副本。你可以测试那个

id(posts['wordsdictcoded'][0]) == id(posts['wordsdictcoded'][1])

请参阅下面的评论(由用户DYZ)以获取解决方案

答案 1 :(得分:0)

正如在另一个答案中所说,问题在于*运算符创建了对相同列表的另一个引用。一种可能的解决方案是强制Python创建多个不同的列表:

posts['wordsdictcoded'] = [[0] * len(vocabulary) for _ in range(len(posts))]