Я пытаюсь создать столбец «Cust Rank», который даст мне случайные числа, которые должны быть основаны на другом столбце «Creator». Единственная загвоздка здесь в том, что случайные числа должны быть одинаковыми для одних и тех же Создателей.
Я пробовал приведенный ниже код, но он не работает должным образом.
df["Cust Rank"] = df.groupby(["Creator"]).transform(pd.Series([np.random.randint(1,5)]))
Вот как я хочу, чтобы это было:
Вы можете получить уникальных Создателей, образец (или перетасовать предметы), затем сопоставить значения:
import random
s = list(df['Creator'].unique())
d = {k:v for v,k in enumerate(random.sample(s, len(s)), start=1)}
df['Cust Rank'] = df['Creator'].map(d)
Другой вариант с пандами sample и факторизацией:
s = df['Creator'].sample(frac=1)
df['Cust Rank'] = pd.Series(pd.factorize(s)[0]+1, index=s.index)
Выход:
Creator Cust Rank
0 A 2
1 A 2
2 B 3
3 C 1
4 C 1
Тогда это не совсем звание? Или вам нужно ранжировать строку по их лексикографическому порядку (df['Creator'].rank(method='dense')
)?
Извините за путаницу. Ранг не является словарным рангом, а чем-то вроде количественного значения, присваиваемого человеку в зависимости от его приоритета в моем процессе. Таким образом, несколько человек могут иметь одно и то же количественное значение, которое я хотел бы назвать рангом.
Тогда df['Rank'] = pd.factorize(df['Creator'])[0]
? но это не «количественно», оно ничего не измеряет. Это просто категория.
Истинный. Но я просто хочу классифицировать создателя столбца на 1-5. Не более того.
Получите уникальные значения с помощью Series.unique , затем примените numpy.random.shuffle и сопоставьте по словарю, созданному zip
в Series.map:
u = df["Creator Cust"].unique()
np.random.shuffle(u)
df["Cust Rank"] = df["Creator Cust"].map(dict(zip(u, np.arange(1,len(u)+1))))
print (df)
Creator Cust Rank Cust Rank
0 A 1 2
1 A 1 2
2 B 2 1
3 C 3 3
4 C 3 3
Спасибо . Это помогло мне. Но что нужно изменить, если я хочу присвоить ранги создателю не длину уникальных значений в создателе, а 1-5. Учитывая, что ранги могут дублироваться для разных имен создателей, но одинаковые имена должны иметь одинаковый ранг