#python #pandas #dataframe #lambda #non-deterministic
#python #pandas #фрейм данных #лямбда #недетерминированный
Вопрос:
У меня есть df:
df = pd.DataFrame({'src':['LV','LA','NC','NY','ABC','XYZ'], 'dest':['NC','NY','LV','LA','XYZ','ABC'], 'dummy':[1,3,6,7,8,10]})
src dest dummy
LV NC 1
LA NY 3
NC LV 6
NY LA 7
ABC XYZ 8
XYZ ABC 10
Я запускаю его через:
df['pair'] = df[['src', 'dest']].apply(lambda x : tuple(set(x)), 1).factorize()[0] 1
чтобы попытаться отключить уникальные пары, такие как (a-> b, b-> a)
Я правильно заканчиваю этим:
src dest dummy pair
LV NC 1 1
LA NY 3 2
NC LV 6 1
NY LA 7 2
ABC XYZ 8 3
XYZ ABC 10 3
Однако иногда, когда я запускаю его, я в конечном итоге неправильно с этим:
src dest dummy pair
LV NC 1 1
LA NY 3 2
NC LV 6 1
NY LA 7 2
ABC XYZ 8 3
XYZ ABC 10 4
Как вы можете видеть, последний элемент по какой-то причине неправильно отключается для пары ‘3’. Это происходит случайным образом. Я могу воспроизвести это, закомментировав код «сопряжения», запустив скрипт для создания и печати df, затем раскомментировав и повторив попытку. Возможно, вы сможете воспроизвести это другими способами, выполнив другие модификации.
Как я могу исправить это недетерминированное поведение?
Ответ №1:
Попробуйте с этим set
, вы можете изменить его на frozenset
df['pair'] = pd.DataFrame(np.sort(df[['src','dest']].values,1)).agg(tuple,1).factorize()[0] 1
Out[108]: array([1, 2, 1, 2, 3, 3], dtype=int64)
Комментарии:
1. Спасибо! где именно используется frozenset в приведенном выше коде?
2. @reeeeeeeeeeeeeee я имею в виду исправил ваш код
df['pair'] = df[['src', 'dest']].apply(lambda x : tuple(frozenset(x)), 1).factorize()[0] 1