#python #pandas #dataframe
Вопрос:
добрый день!
У меня есть подмножество фрейма данных pandas «Набор карт» с непрерывными индексами из-за фильтрации. Фрейм данных содержит «ключевые» значения.
mapSubset val key 0 12 0 2 18 1 4 24 2 6 30 3 8 36 4
В фрейме данных pandas «ссылка», который содержит значения «ключа», соответствующие значениям «ключа» в фрейме данных «Набор карт», я хочу добавить соответствующие индексы из «Набора карт».
(Кадр данных).
link key 0 4 1 2 2 0
Ожидаемый Результат:
link key keyIndex 0 4 8 1 2 4 2 0 0
Я попробовал следующее:
import pandas as pd
import numpy as np
# prepare dummy data
mapFull = pd.DataFrame()
mapFull['val'] = list(range(12,40,3))
mapSubset = mapFull[mapFull.val % 2 == 0]
mapSubset['key'] = list(range(len(mapSubset)))
link = pd.DataFrame()
link['key'] = [4, 2, 0]
# fill 'keyIndex' values into "link" DataFrame
# try No. 1:
# link['keyIndex'] = mapSubset.index[mapSubset.loc[:, 'key'] == link.loc[:, 'key']]
# --> ValueError: Can only compare identically-labeled Series objects
# try No. 2:
link['keyIndex'] = 9999
for pos in range(len(link)):
ii = mapSubset.index[mapSubset.loc[:,'key'] == link.loc[pos,'key']][0]
link.loc[pos,'keyIndex'] = ii
Попытка № 1 привела к
Ошибка значения: Можно сравнивать только объекты серии с одинаковыми метками
Технически я преуспел с «попыткой № 2», хотя это уродливый обходной путь.
Кроме того
SettingWithCopy Предупреждение: Значение пытается быть установлено на копии фрагмента из кадра данных. Попробуйте вместо этого использовать .loc[row_indexer,col_indexer] = значение
воспитывается для mapSubset['key'] = list(range(len(mapSubset)))
.
Как я могу избежать сообщений об ошибках? Как можно достичь ожидаемого результата более приятным способом?
Ответ №1:
Вы всегда можете создать dict
их сопоставить их обратно
link['Keyindex'] = link['key'].map(dict(zip(mapSubset.key,mapSubset.index)))
link
Out[12]:
key Keyindex
0 4 8
1 2 4
2 0 0
Комментарии:
1. Спасибо! Почему вы используете mapSubset.key, а не mapSubset[‘ключ’]? Когда вы используете какой из них?