- О, мальчик. Вот что я придумал.
- Длинная цепь. Я сломаю это.
import pandas as pd
def encode(l):
return pd.DataFrame(l, columns=['item', 'user'])['item'].unique()
# create dataframe
# group by and get dummies
# remove unncessary colums which are not part of encoding class
# apply to create list
def add_user(l, _key_):
return pd.DataFrame(l, columns=['item', 'user']).\
groupby('user')['item'].apply('|'.join).str.get_dummies().\
reindex(columns=_key_).fillna(0).astype('int').\
apply(lambda x: list(x), axis=1)
_key_ = encode ([
['a', 1],
['b', 1],
['c', 1],
['a', 2],
['c', 3],
['b', 4],
['c', 4]
])
add_user([
['a', 1],
['b', 1],
['c', 1],
['a', 2],
['c', 3],
['b', 4],
['c', 4]
], _key_)
Вывод:
user
1 [1, 1, 1]
2 [1, 0, 0]
3 [0, 0, 1]
4 [0, 1, 1]
add_user([['b',5],['d', 5]], _key_)
Вывод:
user
5 [0, 1, 0]
encode
сгенерирует начальный keys
для вашего кодера. add_user
, вы можете вызывать эту функцию для каждого нового пользователя. - ПримечаниеВы можете
reset_index
, чтобы получить user
столбец.
Soulution 2:
- на основе ответа @ WeNYoBen.
import pandas as pd
df = pd.DataFrame([
['a', 1],
['b', 1],
['c', 1],
['a', 2],
['c', 3],
['b', 4],
['c', 4]
], columns=['item', 'user'])
_key_ = df.item.unique()
def add_user(l, _key_):
df = pd.DataFrame(l, columns=['item','user'])
return pd.crosstab(df.user, df.item).reindex(columns=_key_.tolist()).fillna(0).astype('int').apply(list, axis=1)
add_user([['b',5],['d', 5]], _key_)
- Не читаетсяверсия функции
add_user
.
def add_user(l, _key_):
return pd.crosstab(*[[list(x)] for x in list(zip(*l))[::-1]]).reindex(columns=_key_.tolist()).fillna(0).astype('int').apply(list, axis=1)