我的熊猫数据框为news_dataset
,其中列id
是文章ID,列Content
是文章内容(大文本)。给出为
ID Content
17283 WASHINGTON — Congressional Republicans have...
17284 After the bullet shells get counted, the blood...
17285 When Walt Disney’s “Bambi” opened in 1942, cri...
17286 Death may be the great equalizer, but it isn’t...
17287 SEOUL, South Korea — North Korea’s leader, ...
现在,我想将pandas数据帧转换为字典,例如ID
将是一个键,而Content
将是该值。基本上,我起初做的事情是这样的,
dd={}
for i in news_dataset['ID']:
for j in news_dataset['Content']:
dd[j]=i
这段代码很可怜,需要花费大量时间(> 4分钟)进行处理。因此,在检查了一些更好的方法(stackoverflow)之后。我最后要做的是,
id_array=[]
content_array=[]
for id_num in news_dataset['ID']:
id_array.append(id_num)
for content in news_dataset['Content']:
content_array.append(content)
news_dict=dict(zip(id_array,content_array))
此代码将花费近15秒的时间来执行。
我想问的是
i)第一个代码有什么问题,为什么要花这么多时间进行处理?
ii)在涉及大文本数据时,在另一个for
循环中使用for
循环是否是错误的迭代方式?
iii)在单个查询中使用for
循环创建字典的正确方法是什么?
答案 0 :(得分:3)
我认为,如果存在一些非循环,显然是矢量化的替代方案,应该避免熊猫中的循环。
您可以按列index
创建ID
并调用Series.to_dict
:
news_dict=news_dataset.set_index('ID')['Content'].to_dict()
或zip
:
news_dict=dict(zip(news_dataset['ID'],news_dataset['Content']))
#alternative
#news_dict=dict(zip(news_dataset['ID'].values, news_dataset['Content'].values))
性能:
np.random.seed(1425)
#1000rows sample
news_dataset = pd.DataFrame({'ID':np.arange(1000),
'Content':np.random.choice(list('abcdef'), size=1000)})
#print (news_dataset)
In [98]: %%timeit
...: dd={}
...: for i in news_dataset['ID']:
...: for j in news_dataset['Content']:
...: dd[j]=i
...:
61.7 ms ± 2.39 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [99]: %%timeit
...: id_array=[]
...: content_array=[]
...: for id_num in news_dataset['ID']:
...: id_array.append(id_num)
...: for content in news_dataset['Content']:
...: content_array.append(content)
...: news_dict=dict(zip(id_array,content_array))
...:
251 µs ± 3.14 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [100]: %%timeit
...: news_dict=news_dataset.set_index('ID')['Content'].to_dict()
...:
584 µs ± 9.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [101]: %%timeit
...: news_dict=dict(zip(news_dataset['ID'],news_dataset['Content']))
...:
106 µs ± 3.94 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [102]: %%timeit
...: news_dict=dict(zip(news_dataset['ID'].values, news_dataset['Content'].values))
...:
122 µs ± 891 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)