【问题标题】:converting pandas dataframe into dictionary??将熊猫数据框转换为字典??
【发布时间】:2019-05-07 22:41:16
【问题描述】:

我有一个作为 news_dataset 的 pandas 数据框,其中 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 循环创建字典的正确方法是什么?

【问题讨论】:

    标签: python-3.x pandas dictionary


    【解决方案1】:

    我认为,如果存在一些非循环,显然是矢量化的替代方案,应该避免 pandas 中的循环。

    您可以通过ID 列创建index 并调用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)
    

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2018-07-14
      • 2020-12-01
      • 2017-12-12
      • 2018-11-25
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      相关资源
      最近更新 更多