回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个DF,它有两列:问题和答案。“答案”列包含重复项</p>
<p>我现在想创建一个新的DF,它有三列:问题1,问题2,重复</p>
<p>问题1和问题2列将填充为初始DF中所有问题的每个唯一组合。重复列将是布尔值,对应于问题在初始DF中是否有相同的答案</p>
<p>初始DF约为13000行,因此生成的DF将很大(我认为对于我的机器上的Pandas来说太大了,但我可以减少初始DF以进行测试,然后如果我需要所有数据,可以更改为Pandas以外的数据)</p>
<p>有没有比O(N^2)嵌套循环更快的方法,例如,如果没有并行化/矢量化,这需要花费太长的时间:</p>
<pre><code>questions1, questions2, duplicates = [], [], []
for i in range(len(dataset)-1):
print(f'{i+1} / {len(dataset)-1}')
question1 = dataset.iloc[i]['question']
answer1 = dataset.iloc[i]['answer']
for j in range(i+1, len(dataset)):
question2 = dataset.iloc[j]['question']
answer2 = dataset.iloc[j]['answer']
duplicate = answer1 == answer2
questions1.append(question1)
questions2.append(question2)
duplicates.append(duplicate)
duplicate_dataset = pd.DataFrame({
'question1': questions1,
'question2': questions2,
'duplicate': duplicates
})
</code></pre>
<p><strong>编辑:</strong>根据要求,这里是输入DF的玩具示例:</p>
<pre><code>df = pd.DataFrame({
'question': ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yzz'],
'answer': ['1', '2', '1', '3', '4', '4', '5', '1', '6']
})
</code></pre>
<p>结果DF应该等于:</p>
<pre><code>df2 = pd.DataFrame({
'question1': [
'abc', 'abc', 'abc', 'abc',
'abc', 'abc', 'abc', 'abc',
'def', 'def', 'def', 'def',
'def', 'def', 'def', 'ghi',
'ghi', 'ghi', 'ghi', 'ghi',
'ghi', 'jkl', 'jkl', 'jkl',
'jkl', 'jkl', 'mno', 'mno',
'mno', 'mno', 'pqr', 'pqr',
'pqr', 'stu', 'stu', 'vwx'
],
'question2': [
'def', 'ghi', 'jkl', 'mno',
'pqr', 'stu', 'vwx', 'yzz',
'ghi', 'jkl', 'mno', 'pqr',
'stu', 'vwx', 'yzz', 'jkl',
'mno', 'pqr', 'stu', 'vwx',
'yzz', 'mno', 'pqr', 'stu',
'vwx', 'yzz', 'pqr', 'stu',
'vwx', 'yzz', 'stu', 'vwx',
'yzz', 'vwx', 'yzz', 'yzz'
],
'duplicate': [
False, True, False, False,
False, False, True, False,
False, False, False, False,
False, False, False, False,
False, False, False, True,
False, False, False, False,
False, False, True, False,
False, False, False, False,
False, False, False, False
]
})
</code></pre>