我的数据框在几列(名称,年龄,性别)上有重复的行。我想识别所有这些行并从每一行中提取唯一的列值(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数据帧的方法。 请建议一种方法。感谢。
答案 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