![](/img/trans.png)
[英]Create Dataframe with rows made for each string appearing in a column of another 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.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'])
這是使用itertools.combinations
和Series.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.