我有一个DF,其中包含两列:问题和答案。答案列包含重复项。
我现在想创建一个新的DF,其中包含三列:Question1,Question2,重复。
问题1和问题2列将填充为初始DF中所有问题的每个唯一组合。重复列将是布尔值,对应于问题在初始DF中是否具有相同的答案。
初始DF为约13,000行,因此,最终的DF将很大(我认为对于机器上的Pandas而言太大了,但是如果我需要所有的DDF,我可以减少初始DF以进行测试,然后更改为除Pandas之外的其他值。数据)。
是否有办法比O(N ^ 2)嵌套循环更快,因此如果没有并行化/矢量化,这将花费太长时间:
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
})
编辑:根据要求,这是输入DF的玩具示例:
df = pd.DataFrame({
'question': ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yzz'],
'answer': ['1', '2', '1', '3', '4', '4', '5', '1', '6']
})
最终的DF应该等于:
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
]
})
这是另一个解决方案,仍然依靠itertools.combinations和zip。
分别使用df.question和df.answer,使用组合来创建非重复对,使用列表推导来获取True或False的配对,最后使用输出创建一个新的数据框。
from itertools import combinations
#zip columns, then combine
M = (combinations(zip(df.question,df.answer),2))
#list comprehension here to get ur True or False entries
outcome = [(i[0],j[0],True)
if i[-1]==j[-1] else (i[0],j[0],False)
for i, j in M]
#create new dataframe
new_df = pd.DataFrame(outcome,columns= ['question1','question2','duplicate'])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句