使用数据框在 python 中工作,我试图匹配某些行并根据成功匹配创建一个新列 - 例如如果“品种”+“颜色”匹配,则将匹配行的“名称”放在配对中男性的“伴侣”列中。例如,在下表中,亚当/夏娃和安东尼/克利奥帕特拉应该匹配,导致夏娃和克利奥帕特拉分别被放在亚当和安东尼的“伴侣”列中。由于 Clyde 和 Beauty 的品种不同,因此不会发生这种情况。
姓名 | 品种 | 颜色 | 性别 | 伴侣? |
---|---|---|---|---|
亚当 | 拳击手 | 白色 | 男 | (夏娃) |
夏娃 | 拳击手 | 白色 | 女 | |
安东尼 | 实验室 | 巧克力 | 男 | (克娄巴特拉) |
克利奥帕特拉 | 实验室 | 巧克力 | 女 | |
克莱德 | 哈士奇 | 灰色 | 男 | |
美容 | 斗牛犬 | 灰色 | 女 |
谢谢!!
答案 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