преобразование панда данных в словарь ?? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть кадр данных pandas как news_dataset, где столбец 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 голосов
/ 06 декабря 2018

Я думаю, что, как правило, следует избегать циклов в пандах, если существуют нецикловые, явно векторизованные альтернативы.

Вы можете создать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...