#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