Многоколоночный факторизация в пандах

Панды factorize Функция присваивает каждому уникальному значению в серии последовательный индекс на основе 0 и вычисляет, к какому индексу принадлежит каждая запись в серии.

Я хотел бы сделать эквивалент pandas.factorize на нескольких столбцах:

import pandas as pd
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]})
pd.factorize(df)[0] # would like [0, 1, 2, 2, 1, 0]

То есть я хочу определить каждый уникальный набор значений в нескольких столбцах фрейма данных, назначить последовательный индекс каждому и вычислить, к какому индексу относится каждая строка в фрейме данных.

Factorize работает только на отдельных столбцах. Есть ли в пандах многостолбцовая эквивалентная функция?

4 ответа

Решение

Вы должны сначала создать ndarray из кортежа, pandas.lib.fast_zip может сделать это очень быстро в цикле Cython.

import pandas as pd
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]})
print pd.factorize(pd.lib.fast_zip([df.x, df.y]))[0]

выход:

[0 1 2 2 1 0]

Я не уверен, что это эффективное решение. Там могут быть лучшие решения для этого.

arr=[] #this will hold the unique items of the dataframe
for i in df.index:
   if list(df.iloc[i]) not in arr:
      arr.append(list(df.iloc[i]))

так что печать arr даст вам

>>>print arr
[[1,1],[1,2],[2,2]]

для хранения индексов я бы объявил массив ind

ind=[]
for i in df.index:
   ind.append(arr.index(list(df.iloc[i])))

печать инд даст

 >>>print ind
 [0,1,2,2,1,0]
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]})
tuples = df[['x', 'y']].apply(tuple, axis=1)
df['newID'] = pd.factorize( tuples )[0]

Ты можешь использовать drop_duplicates отбросить эти дублированные строки

In [23]: df.drop_duplicates()
Out[23]: 
      x  y
   0  1  1
   1  1  2
   2  2  2

РЕДАКТИРОВАТЬ

Чтобы достичь своей цели, вы можете присоединить свой оригинальный df к каталогу drop_duplicated:

In [46]: df.join(df.drop_duplicates().reset_index().set_index(['x', 'y']), on=['x', 'y'])
Out[46]: 
   x  y  index
0  1  1      0
1  1  2      1
2  2  2      2
3  2  2      2
4  1  2      1
5  1  1      0
Другие вопросы по тегам