将熊猫数据框转换成字典?

时间:2018-12-06 09:10:40

标签: python-3.x pandas dictionary

我的熊猫数据框为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循环创建字典的正确方法是什么?

1 个答案:

答案 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)