Python 从重复行中提取值并将其拟合到新的数据帧
我有一个数据框,它在几列(姓名、年龄、性别)上有重复的行。我想识别所有这样的行,并从每一行提取一个唯一的列值(account_no)。这些列值将被装配到一个新的数据框中(带有源和目标列) 我正在努力实现: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
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