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

时间:2017-05-26 10:40:43

标签: python pandas dataframe duplicates

我的数据框在几列(名称,年龄,性别)上有重复的行。我想识别所有这些行并从每一行中提取唯一的列值(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'])

我正在努力实现:

source    target    
101       106       
102       104
104       107
107       102
108       109

我试图找到重复项并使用groupby对它们进行分组,但无法找到一种方法使它们适合包含源和目标列的新数据框。

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)

我无法找到适合从重复行中的account_no到单行out数据帧的方法。 请建议一种方法。感谢。

1 个答案:

答案 0 :(得分:0)

考虑以下方法:

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