创建一个DataFrame,它由另一个的所有行对组成

科宝

我有一个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
    ]
})
sammywemmy

这是另一个解决方案,仍然依靠itertools.combinationszip

分别使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我想创建一个嵌套数组,它由另一个数组中的所有元素组成,但分为两个

如何创建由另一个组成的结构

是否可以创建由一定比例的另一个列表组成的列表?

创建由R中的另一个变量分组的变量的所有值的列表

使用另一个数组创建一个由 1 和 0 组成的数组

从另一个 DataFrame 创建一个没有 NaN 值的 DataFrame

将DataFrame的所有列乘以另一个DataFrame的行

PostgreSQL为另一个表的所有行创建外键

创建一个新的ArrayList,其中包含另一个ArrayList的所有元素,除了一行代码中的一行

同一个表的所有记录由一个字段关联但由另一个字段查询 - sqlserver

创建一个由n个元素组成的数组

如何生成一个 List<KeyValuePair<string, int>> 由另一个列表中的分组组成?

如果要定义一个由另一个类的实例组成的类,应该如何组织代码?

找到一个变量的子集由另一个变量组成的平均值

将一个数字转换为另一个由 9 组成的数字

从另一个分支创建一个分支而不跟踪它

创建一个接口并在另一个包中实现它

从分组框中的另一个DataFrame的每一行创建DataFrame?

SELECT 一个表的一行,以及另一个表中的所有行

查找由另一个分组的变量的所有组合

在一个文件中创建一个函数并从另一个文件访问它 - Python

数组是否由另一个数组的任何值组成

在一个函数中创建一个数组,然后在另一个函数中读取它而没有返回语句

创建一个ArrayList的ArrayList,与另一个ArrayList的ArrayList相比,它具有一个附加元素

如何求和并表示一个DataFrame来创建另一个DataFrame

如何创建一个由kx2散点图组成的海洋情节,并共享所有类别的共享图例

如何用另一个表的所有列的相同数据类型创建一个表?

创建一个由单个字母组成的框架

根据另一个 DataFrame 创建包含具有值的 dicts 的 DataFrame