从熊猫
问题描述:
列表变量列我有一个熊猫数据帧,看起来像这样:从熊猫
user items
1 ["product1", "product2", "product3"]
2 ["product5", "product7", "product2"]
3 ["product1", "product4", "product5"]
我有各有一个名单100种产品的 2个百万用户。 我需要改变我的数据帧是这样的:
user item_1 item_2 item_3
1 "product1" "product2" "product3"
2 "product5" "product7" "product2"
3 "product1" "product4" "product5"
有谁有一个“Python化”,快速的方法来做到这一点? 我不想想要通过for循环,它需要太多的时间。
谢谢
答
您可以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
答
你可以试试:
df[['user']].join(df['items'].apply(pd.Series).add_prefix('item_'))
应该产生:
# user item_0 item_1 item_2
# 0 1 product1 product2 product3
# 1 2 product5 product7 product2
# 2 3 product1 product4 product5
我希望这有助于。
+0
谢谢阿卜杜! :) –
that works too :)谢谢 –
@MohamedALANI你有没有试过你的数据? – piRSquared
我尝试过200行,它的工作原理。两种方法花费了太多时间,我需要去。我明天就跑这个,回来告诉你跑步时间。顺便说一句,我其实有100个产品,而不是30 –