Попытка присвоить идентификаторы парам в фрейме данных pandas, получение противоречивых результатов

#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