首页 > 解决方案 > 根据不同数据框的标准将函数应用于数据框列,同时确保没有重复

问题描述

我有两个数据框:

data = [[10],[10],[10],[20],[20],[20],[30],[30],[30]]
df = pd.DataFrame(data, columns=['Number'])

nameList=[['grant',10],['grant',10],['grant',10],['grant',10],['greg',10],['thom',10],['amy',20],['steve',20],['sally',20],['ralph',30],['olive',30],['bobb',30]]
nameDF = pd.DataFrame(nameList, columns=['Name','Number'])

我想根据从 nameDF 中随机选择的名称创建一个新列,条件为 Number=Number。我不想重复。

我尝试创建一个函数并使用 apply 但如果随机选择名称已经在新列中,我无法弄清楚如何再次应用函数。我不确定这是否是解决这个问题的正确方法。请帮忙!

def random_word(num):
    numDF = nameDF[nameDF['Number']==num]
    return np.random.choice(numDF['Name'],1)

df['New_Name'] = df['Number'].apply(random_word)

标签: pythonpandas

解决方案


这对你有用吗?我刚刚在您的代码中添加了 3-4 行。创建了 2 个列表(lst,lst2)并继续将值附加到已经选择的 lst2。在选择随机名称并返回 New_Name 列的值之前,它将检查lst2 中是否存在该值,以避免最终 df 中的名称重复。

def random_word(num):
    numDF = nameDF[nameDF['Number']==num]
    global lst
    lst = numDF['Name'].tolist()
    x = np.random.choice([i for i in lst if i not in lst2],1)[0]
    lst2.append(x)
    return x
global lst2
lst2 =[]
df['New_Name'] = df['Number'].apply(random_word)
df

在此处输入图像描述


推荐阅读