Является ли замена по строкам и будет перезаписывать значение внутри dict дважды? - PullRequest
0 голосов
/ 26 сентября 2018

Предполагая, что у меня следующий набор данных

lst = ['u', 'v', 'w', 'x', 'y']
lst_rev = list(reversed(lst))
dct = dict(zip(lst, lst_rev))

df = pd.DataFrame({'A':['a', 'b', 'a', 'c', 'a'],
                   'B':lst},
                   dtype='category')

Теперь я хочу replace значение столбца B в df на dct

Я знаю, что могу сделать

df.B.map(dct).fillna(df.B)

, чтобы получить ожидаемый результат, но когда я тестирую с replace (что является более простым основанием для моего мышления), я потерпел неудачу

Out out showкак показано ниже

df.B.replace(dct)
Out[132]: 
0    u
1    v
2    w
3    v
4    u
Name: B, dtype: object

Что отличается от

df.B.map(dct).fillna(df.B)
Out[133]: 
0    y
1    x
2    w
3    v
4    u
Name: B, dtype: object

Я могу думать, что причина, почему это происходит, Но почему?

0    u --> change to y then change to u
1    v --> change to x then change to v
2    w
3    v
4    u

Ценю вашу помощь.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Это поведение не предназначено и было признано ошибкой.

Это проблема Github , которая сначала идентифицировала поведение, и она была добавлена ​​каквехой для pandas 0.24.0.Я могу подтвердить, что замена работает должным образом в текущей версии на Github.

Вот PR, содержащий исправление.

0 голосов
/ 26 сентября 2018

Это потому, что replace продолжает применять словарь

df.B.replace({'u': 'v', 'v': 'w', 'w': 'x', 'x': 'y', 'y': 'Hello'})

0    Hello
1    Hello
2    Hello
3    Hello
4    Hello
Name: B, dtype: object

С заданными dct 'u' -> 'y' затем 'y' -> 'u'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...