Как выбрать случайный элемент из словаря в df и исключить один элемент?

#python #pandas #numpy

Вопрос:

У меня есть словарь и фрейм данных, например:

 data={'Name': ['Tom', 'Joseph', 'Krish', 'John']}
df=pd.DataFrame(data)
print(df)

city={"New York": "123", 
 "LA":"456",
 "Miami":"789"}

Output:
     Name
0     Tom
1  Joseph
2   Krish
3    John
 

Я создал столбец под названием ГОРОД, используя следующее:

 df["CITY"]=np.random.choice(list(city), len(df))
df


Name    CITY
0   Tom New York
1   Joseph  LA
2   Krish   Miami
3   John    New Yor
 

Теперь я хотел бы создать новый столбец — CITY2 со случайным элементом из словаря городов, но я хотел бы, чтобы ГОРОД был другим элементом, чем CITY2, поэтому, в основном, когда я создаю CITY2, мне нужно исключить элемент ГОРОДА.

Стоит отметить, что мой реальный df довольно велик, поэтому мне нужно, чтобы он был максимально эффективным.

Заранее спасибо.

Комментарии:

1. вы хотите исключить все элементы города или хотите сравнить строки по строкам?

Ответ №1:

  • продолжайте использовать подход, который вы использовали
  • были использованы pd.Series() для удобства удаления значения, которое уже использовалось
  • завернутый, apply() чтобы получить значение каждой строки
 data={'Name': ['Tom', 'Joseph', 'Krish', 'John']}
df=pd.DataFrame(data)
city={"New York": "123", 
 "LA":"456",
 "Miami":"789"}
df["CITY"]=np.random.choice(list(city), len(df))

df["CITY2"] = df["CITY"].apply(lambda x: np.random.choice(pd.Series(city).drop(x).index))

 
Имя город ГОРОД2
0 Том Майами НЬЮ-ЙОРК
1 Джозеф LA Майами
2 Криш НЬЮ-ЙОРК Майами
3 Джон НЬЮ-ЙОРК LA

Ответ №2:

Вы также можете сначала сгруппироваться по «ГОРОДУ», удалить текущий город для каждой группы из списка городов, а затем создать новый случайный список городов.

Может быть, это быстрее, потому что вам нужно отбрасывать не один город в строке, а в группе.

 city2 = pd.Series()
for key,group in df.groupby('CITY'):
   cities_subset = np.delete(np.array(list(city)),list(city).index(key))
   city2 = city2.append(pd.Series(np.random.choice(cities_subset, len(group)),index=group.index))
df["CITY2"] = city2
 

Это дает, например:

 Name      CITY     CITY2
0     Tom  New York        LA
1  Joseph  New York     Miami
2   Krish        LA  New York
3    John  New York        LA