如何在 python 中匹配数据框的行,根据正确匹配创建一个新列?

时间:2021-06-25 18:02:48

标签: python pandas numpy

使用数据框在 python 中工作,我试图匹配某些行并根据成功匹配创建一个新列 - 例如如果“品种”+“颜色”匹配,则将匹配行的“名称”放在配对中男性的“伴侣”列中。例如,在下表中,亚当/夏娃和安东尼/克利奥帕特拉应该匹配,导致夏娃和克利奥帕特拉分别被放在亚当和安东尼的“伴侣”列中。由于 Clyde 和 Beauty 的品种不同,因此不会发生这种情况。

<头>
姓名 品种 颜色 性别 伴侣?
亚当 拳击手 白色 (夏娃)
夏娃 拳击手 白色
安东尼 实验室 巧克力 (克娄巴特拉)
克利奥帕特拉 实验室 巧克力
克莱德 哈士奇 灰色
美容 斗牛犬 灰色

谢谢!!

2 个答案:

答案 0 :(得分:0)

from collections import defaultdict

# First collect the Potential names of mates
mates = defaultdict(list)
for row in df.itertuples():
    props = (row.Breed, row.Color)
    mates[props].append(row.Name)

# Secondly create Mate column
def return_mates(name, breed, color):
    match = (breed, color)
    return [m for m in mates[match] if m != name]

df.loc[:, 'Mate'] = df[['Name', 'Breed', 'Color']].apply(lambda x: return_mates(*x), axis=1)

答案 1 :(得分:0)

一种方式:

df['Mate?'] = df.Name.map(dict(df.groupby(['Breed', 'Color'])['Name'].agg(list).apply(pd.Series).dropna().values)).fillna('')
输出:
        Name    Breed      Color     Sex      Mate?
0       Adam    Boxer      White    Male        Eve
1        Eve    Boxer      White  Female           
2     Antony      Lab  Chocolate    Male  Cleopatra
3  Cleopatra      Lab  Chocolate  Female           
4      Clyde    Husky       Gray    Male           
5     Beauty  Bulldog       Gray  Female