代码优化 - 将值列表转换为列
Code Optiomiztion - Converting List Of Values Into Columns
我有一个数据框,其中一列是用户 ID,第二列是他拥有的项目的项目 ID 的逗号分隔值组成的字符串。我必须将其转换为结果数据框,该数据框将用户 ID 作为索引,并将唯一项目 ID 作为列,当用户拥有该项目时值为 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()
但是,这段代码显然效率低下,我正在寻找一个更快的解决方案来解决这个问题。
让我们尝试 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
我有一个数据框,其中一列是用户 ID,第二列是他拥有的项目的项目 ID 的逗号分隔值组成的字符串。我必须将其转换为结果数据框,该数据框将用户 ID 作为索引,并将唯一项目 ID 作为列,当用户拥有该项目时值为 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()
但是,这段代码显然效率低下,我正在寻找一个更快的解决方案来解决这个问题。
让我们尝试 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