从列表变量到熊猫中的列

穆罕默德·阿尔·阿尼

我有一个看起来像这样的Pandas Dataframe:

user    items
1       ["product1", "product2", "product3"]
2       ["product5", "product7", "product2"]
3       ["product1", "product4", "product5"]

我有200万用户,每个用户都有100种产品列表我需要这样转换我的数据框:

user    item_1        item_2        item_3
1       "product1"    "product2"    "product3"
2       "product5"    "product7"    "product2"
3       "product1"    "product4"    "product5"

有没有人有一个“ pythonic”的快速方法呢?不想经历循环,这需要太多时间。

谢谢

海盗

您可以使用df['items'].values.tolist()进行重构join
我走了这个方向,因为它比快apply

考虑到您的数据量很大,您将需要它。

df.drop('items', 1).join(
    pd.DataFrame(df['items'].values.tolist(), df.index).rename(
        columns=lambda x: 'item_{}'.format(x + 1)
    )
)

   user    item_1    item_2    item_3
0     1  product1  product2  product3
1     2  product5  product7  product2
2     3  product1  product4  product5

我们可以为此节省一点时间

items_array = np.array(df['items'].values.tolist())
cols = np.core.defchararray.add(
    'item_', np.arange(1, items_array.shape[1] + 1).astype(str)
)
pd.DataFrame(
    np.column_stack([df['user'].values, items_array]),
    columns=np.append('user', cols)
)

定时

%timeit df[['user']].join(df['items'].apply(pd.Series).add_prefix('item_'))
%timeit df.drop('items', 1).join(pd.DataFrame(df['items'].values.tolist(), df.index).rename(columns=lambda x: 'item_{}'.format(x + 1)))

1000 loops, best of 3: 1.8 ms per loop
1000 loops, best of 3: 1.34 ms per loop

%%timeit
items_array = np.array(df['items'].values.tolist())
cols = np.core.defchararray.add(
    'item_', np.arange(1, items_array.shape[1] + 1).astype(str)
)
pd.DataFrame(
    np.column_stack([df['user'].values, items_array]),
    columns=np.append('user', cols)
)

10000 loops, best of 3: 188 µs per loop

大数据

n = 20000
items = ['A%s' % i for i in range(1000)]
df = pd.DataFrame(dict(
        user=np.arange(n),
        items=np.random.choice(items, (n, 100)).tolist()
    ))

%timeit df[['user']].join(df['items'].apply(pd.Series).add_prefix('item_'))
%timeit df.drop('items', 1).join(pd.DataFrame(df['items'].values.tolist(), df.index).rename(columns=lambda x: 'item_{}'.format(x + 1)))

1 loop, best of 3: 3.22 s per loop
1 loop, best of 3: 492 ms per loop

%%timeit
items_array = np.array(df['items'].values.tolist())
cols = np.core.defchararray.add(
    'item_', np.arange(1, items_array.shape[1] + 1).astype(str)
)
pd.DataFrame(
    np.column_stack([df['user'].values, items_array]),
    columns=np.append('user', cols)
)

1 loop, best of 3: 389 ms per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章