Элементы связи в фрейме данных Pandas

#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[‘ключ’]? Когда вы используете какой из них?