Как l oop через текст словаря, который имеет одно значение? - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблемы со словарем, который содержит одно значение. Это единственное значение в текстовом виде выглядит следующим образом:

    dict_values([{'top':                       query  value
0      the urban dictionary    100
1                definition     50
2    urban dictionary words     12
3    urban dictionary names     10
4     word urban dictionary     10
5          urban outfitters      9
6     thot urban dictionary      8
7      dog urban dictionary      6
8      cap urban dictionary      6
9     urban dictionary yeet      6
10                     yeet      6
11     top urban dictionary      5
12    stan urban dictionary      4
13  urban dictionary boomer      4
14                   boomer      4
15    fomo urban dictionary      4
16    urban dictionary drip      4
17     smh urban dictionary      4
18                      smh      4
19                urban air      3
20     tea urban dictionary      3
21   green urban dictionary      3
22     bet urban dictionary      3
23                     vsco      3
24    goat urban dictionary      3

Я хочу преобразовать этот словарь в фрейм данных с тремя столбцами - индекс, запрос и популярность. Любая идея, как это сделать?

Вот код для получения словаря:

!pip install pytrends
import pandas as pd                        
from pytrends.request import TrendReq
pytrend = TrendReq()
ytrend.build_payload(kw_list=['urban dictionary'],timeframe='2019-01-01 2019-12-31')
related_queries = pytrend.related_queries()
related_queries.values()

Приветствия,

edit: выходные данные должны быть кадром данных, а не словарем

Ответы [ 2 ]

1 голос
/ 16 апреля 2020
from typing import List, NamedTuple


class Entry(NamedTuple):
    index: int
    query: str
    popularity: int


def format_dictionary_text(text: str) -> List[Entry]:
    entries: List[Entry] = []
    for line in text.split("\n"):
        tokens = line.split()
        if len(tokens) < 3:
            continue  # "query value" garbage at top?
        entries.append(Entry(
            int(tokens[0]),
            " ".join(tokens[1:-1]),
            int(tokens[-1])
        ))
    return entries


text = """             query value
0      the urban dictionary    100
1                definition     50
2    urban dictionary words     12
3    urban dictionary names     10
4     word urban dictionary     10
5          urban outfitters      9
6     thot urban dictionary      8
7      dog urban dictionary      6
8      cap urban dictionary      6
9     urban dictionary yeet      6
10                     yeet      6
11     top urban dictionary      5
12    stan urban dictionary      4
13  urban dictionary boomer      4
14                   boomer      4
15    fomo urban dictionary      4
16    urban dictionary drip      4
17     smh urban dictionary      4
18                      smh      4
19                urban air      3
20     tea urban dictionary      3
21   green urban dictionary      3
22     bet urban dictionary      3
23                     vsco      3
24    goat urban dictionary      3
"""

print(format_dictionary_text(text))

Список из NamedTuple кажется мне наиболее удобным представлением, но было бы просто преобразовать его в какой-то диктовку, если вы предпочитаете.

1 голос
/ 16 апреля 2020
data2 = dict(re.findall("\s*([a-zA-Z ]+[a-zA-Z])\s{2,}(\d+)",data['top']))

Полагаю, вы были бы довольно близки (цифры - это строки в результате ...)

, хотя я бы рискнул предположить, что ваши данные ['top'] на самом деле фрейм данных, а не строка (в зависимости от напечатанного представления)

, в этом случае вы можете сделать data['top']['query'], и это напечатало бы весь этот столбец, или выполните data['top'][data['top']['query'] == 'urban outfitters'], чтобы увидеть только соответствующую строку

...