Python 从重复行中提取值并将其拟合到新的数据帧

Python 从重复行中提取值并将其拟合到新的数据帧,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,我有一个数据框,它在几列(姓名、年龄、性别)上有重复的行。我想识别所有这样的行,并从每一行提取一个唯一的列值(account_no)。这些列值将被装配到一个新的数据框中(带有源和目标列) 我正在努力实现: source target 101 106 102 104 104 107 107 102 108 109 我试图找到重复项并使用groupby对它们进行分组,但无法找到一种方法将它们放入新的datafr

我有一个数据框,它在几列(姓名、年龄、性别)上有重复的行。我想识别所有这样的行,并从每一行提取一个唯一的列值(account_no)。这些列值将被装配到一个新的数据框中(带有源和目标列)

我正在努力实现:

source    target    
101       106       
102       104
104       107
107       102
108       109
我试图找到重复项并使用groupby对它们进行分组,但无法找到一种方法将它们放入新的dataframe中,该dataframe由source和target列组成

import pandas as pd

data={'name':['a','b','c','b','d','a','b','a','a'],'age':[28,22,22,22,25,28,22,22,22],'gender':['m','m','m','m','m','m','m','m','m'],'account_no':[101,102,103,104,105,106,107,108,109]}
dataset = pd.DataFrame(data,columns=['name','age','gender','account_no'])
import pandas as pd

data={'name':['a','b','c','b','d','a','b','a','a'],'age':[28,22,22,22,25,28,22,22,22],'gender':['m','m','m','m','m','m','m','m','m'],'account_no':[101,102,103,104,105,106,107,108,109]}
dataset = pd.DataFrame(data,columns=['name','age','gender','account_no'])
out = pd.DataFrame(columns=['Source','Target'])
df_res = pd.DataFrame()

duplicates = dataset[dataset.duplicated(subset=['name','age','gender'],keep=False)]
df_res = pd.concat(g for _, g in duplicates.groupby(['name','age','gender']) if len(g) > 1)
我找不到一种方法可以将重复行中的帐户号放入out数据帧的一行中。
请建议一种方法。谢谢。

考虑以下方法:

from itertools import combinations, chain

d = df.groupby(['name','age','gender'])['account_no'] \
      .apply(lambda x: list(combinations(x, 2))) \
      .values

new = pd.DataFrame(sorted(chain.from_iterable(d)), columns=['source','target']) \
        .sort_values(['source','target'])
结果:

In [416]: new
Out[416]:
   source  target
0     101     106
1     102     104
2     102     107
3     104     107
4     108     109

考虑以下方法:

from itertools import combinations, chain

d = df.groupby(['name','age','gender'])['account_no'] \
      .apply(lambda x: list(combinations(x, 2))) \
      .values

new = pd.DataFrame(sorted(chain.from_iterable(d)), columns=['source','target']) \
        .sort_values(['source','target'])
结果:

In [416]: new
Out[416]:
   source  target
0     101     106
1     102     104
2     102     107
3     104     107
4     108     109