簡體   English   中英

創建一個由來自另一個的所有行對組成的 DataFrame

[英]Create a DataFrame which is made of all pairs of rows from another

我有一個 DF,它有兩列:問題和答案。 答案列包含重復項。

我現在想創建一個新的 DF,它有三列:問題 1、問題 2、重復。

question1 和 question2 列將填充為初始 DF 中所有問題的每個唯一組合。 重復列將是對應於問題在初始 DF 中是否具有相同答案的布爾值。

初始 DF 是 ~13,000 行,因此生成的 DF 會很大(我認為對於我機器上的 Pandas 來說太大了,但是我可以減少初始 DF 進行測試,然后如果我需要所有數據)。

有沒有比 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.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'])

這是使用itertools.combinationsSeries.map的一種方法:

from itertools import combinations

# Create mapping Series of questions - answers
q_map = df.drop_duplicates(subset='question').set_index('question')['answer']

# Create DataFrame of all combinations of questions
df2 = pd.DataFrame(combinations(df['question'].unique(), 2), columns=['question1', 'question2'])

# Create duplicate field using the helper mapping Series
df2['duplicate'] = df2['question1'].map(q_map) == df2['question2'].map(q_map)

[出去]

   question1 question2  duplicate
0        abc       def      False
1        abc       ghi       True
2        abc       jkl      False
3        abc       mno      False
4        abc       pqr      False
5        abc       stu      False
6        abc       vwx       True
7        abc       yzz      False
8        def       ghi      False
9        def       jkl      False
10       def       mno      False
11       def       pqr      False
12       def       stu      False
13       def       vwx      False
14       def       yzz      False
15       ghi       jkl      False
16       ghi       mno      False
17       ghi       pqr      False
18       ghi       stu      False
19       ghi       vwx       True
20       ghi       yzz      False
21       jkl       mno      False
22       jkl       pqr      False
23       jkl       stu      False
24       jkl       vwx      False
25       jkl       yzz      False
26       mno       pqr       True
27       mno       stu      False
28       mno       vwx      False
29       mno       yzz      False
30       pqr       stu      False
31       pqr       vwx      False
32       pqr       yzz      False
33       stu       vwx      False
34       stu       yzz      False
35       vwx       yzz      False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM