У меня есть фреймворк с идентификатором пользователя в одном столбце и строкой, состоящей из разделенных запятыми значений идентификаторов элементов для элементов, которыми он владеет, во втором столбце. Я должен преобразовать это в результирующий фрейм данных с идентификаторами пользователей в качестве индексов и уникальными идентификаторами элементов в виде столбцов со значением 1, когда этот пользователь имеет элемент, и 0, когда у пользователя нет элемента. Ниже приводится суть проблемы и подход, который я использую в настоящее время для ее решения.

temp = pd.DataFrame([[100, '10, 20, 30'],[200, '20, 30, 40']], columns=['userid','listofitemids'])
print(temp)

temp.listofitemids = temp.listofitemids.apply(lambda x:set(x.split(', ')))

dat = temp.values

df = pd.DataFrame(data = [[1]*len(dat[0][1])], index = [dat[0][0]], columns=dat[0][1])
for i in range(1, len(dat)):
    t = pd.DataFrame(data = [[1]*len(dat[i][1])], index = [dat[i][0]], columns=dat[i][1])
    df = df.append(t, sort=False)
df.head()

enter image description here

Однако этот код явно неэффективен, и я ищу более быстрое решение этой проблемы.

1
Prathamesh Mahankal 8 Сен 2020 в 03:13

1 ответ

Лучший ответ

Давайте попробуем str.split с explode, затем crosstab

s = temp.assign(listofitemids=temp['listofitemids'].str.split(', ')).explode('listofitemids')
s = pd.crosstab(s['userid'], s['listofitemids']).mask(lambda x : x.eq(0))
s
Out[266]: 
listofitemids   10  20  30   40
userid                         
100            1.0   1   1  NaN
200            NaN   1   1  1.0
1
BENY 8 Сен 2020 в 00:20