Фильтрация данных на основе различий между двумя сериями, одна из которых отображается через словарь - PullRequest
0 голосов
/ 13 ноября 2018

у меня есть словарь

d = {'A':1, 'B':2, 'C':3}

и мой фрейм данных

df =pd.DataFrame({
"col1": ["A", "B", "C"],
"col2": [1, 2, 3],
"col3": [2, 1, 4] })

Я ищу, чтобы сравнить каждое значение в df с соответствующим значением в словаре. Если оно соответствует, значение сохраняется, в противном случае значение сбрасывается.

Я пытаюсь

m = df['col2'] >= d[df['col1']]
df.where(m, df, other = "")

Но он получает этот код ошибки для m: TypeError: Объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать ...

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Вы можете использовать pd.Series.map с loc и логическим индексированием:

df = df.loc[df['col2'] >= df['col1'].map(d)]
0 голосов
/ 13 ноября 2018

Подсказка есть в самом сообщении об ошибке.

TypeError: объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать.

df['col1'] - это объект Series, который является изменяемым объектом.

Изменяемые объекты не могут быть хэшированы и, следовательно, не могут использоваться в качестве ключа словаря. Из документов :

... словари индексируются по ключам, которые могут быть любого неизменного типа ; строки и цифры всегда могут быть ключами ...

Вы используете Series объект в качестве словарного ключа. Один способ переписать d[df['col1']] - это:

[d[x] for x in df['col1']]
0 голосов
/ 13 ноября 2018

Создать новый столбец для сравнения с помощью apply

df[‘dict_col’] = df[‘col1’].apply(lambda k: d[k])

m = df[‘dict_col’] >= df[‘col2’]

df[‘col2’] = df[‘col2’].where(m, df, other = "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...