Многоколоночный факторизация в пандах
Панды 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