#python #python_3x #словари
Столкнулся с необходимостью представить python словарь (dictionary) в какую-либо таблицу(может быть в базу данных, или еще как). подскажите, как лучше это осуществить? И, может быть данные лучше хранить данные не в словаре, а в Series? import pandas as pd import pymysql import numpy as np db = pymysql.connect(host='localhost', user='root', passwd='', database='mom_db', charset='utf8') df = pd.read_sql("SELECT * FROM comments ", db) cursor = db.cursor() name = df['nickname'] count = pd.value_counts(name) a = {count.index[i]:count[i] for i in range(len(count))} print(a) #print(count[count>1])-вывод Series выводит: {'repeinik': 26, 'podberezowik': 24, 'Павел_Шуков_talks48': 20, 'stupich': 14, 'kipovets': 14, 'Лайош_Портиш': 13, 'vijigau_mraz': 13, 'наивная баба': 12, 'genek77': 12, 'Sergey_Petrov': 12, 'Андрей_Иванов_talks19': 11, 'Пачотны тунеядзец': 10, 'eugenenus_': 10, 'Настя_Романова': 9, 'Kac_Lol': 9, 'Ириша_Лалапусечка': 9, 'valstar78': 8, 'Сергей Александрович': 8, 'Tadeush_Тадеуш': 8, 'freedom for us': 7, 'Светлана_Малышкина': 7, 'Костя_Миронов': 7, 'SIgarA': 6, 'Жанна_Д-урк': 6, 'Fair play': 6, 'Лукашенко_Федор': 6, 'Lisa_Grodno': 5, 'id350886439': 5,...... и если выводить Series: repeinik 26 podberezowik 24 Павел_Шуков_talks48 20 stupich 14 kipovets 14 Лайош_Портиш 13 .......
Ответы
Ответ 1
Мне вот у модуля tabulate нравятся таблицы (а через параметр tablefmt можно разные стили задавать): # pip install tabulate from tabulate import tabulate d = {'repeinik': 26, 'podberezowik': 24, 'Павел_Шуков_talks48': 20, 'stupich': 14, 'kipovets': 14, 'Лайош_Портиш': 13, 'vijigau_mraz': 13, 'наивная баба': 12, 'genek77': 12} print(tabulate(d.items(), headers=['NAME', 'VALUE'], tablefmt="grid")) Консоль: +---------------------+---------+ | NAME | VALUE | +=====================+=========+ | repeinik | 26 | +---------------------+---------+ | podberezowik | 24 | +---------------------+---------+ | Павел_Шуков_talks48 | 20 | +---------------------+---------+ | stupich | 14 | +---------------------+---------+ | kipovets | 14 | +---------------------+---------+ | Лайош_Портиш | 13 | +---------------------+---------+ | vijigau_mraz | 13 | +---------------------+---------+ | наивная баба | 12 | +---------------------+---------+ | genek77 | 12 | +---------------------+---------+Ответ 2
d = {'repeinik': 26, 'podberezowik': 24, 'Павел_Шуков_talks48': 20, 'stupich': 14, 'kipovets': 14, 'Лайош_Портиш': 13, 'vijigau_mraz': 13, 'наивная баба': 12, 'genek77': 12} print("{:<20} {:<15}".format('Name','Value')) for v in d.items(): name, val = v print("{:<20} {:<15}".format(name, val)) Результат Name Value repeinik 26 podberezowik 24 Павел_Шуков_talks48 20 ... ... Похожий вопрос на SO: https://stackoverflow.com/questions/17330139/python-printing-a-dictionary-as-a-horizontal-table-with-headersОтвет 3
print('{:<20} {:<15}'.format('NickName', 'Numb_comm')) for name, n_comm in a.items(): print('{:<20} {:<15}'.format(name, n_comm)) результат NickName Numb_comm repeinik 26 podberezowik 24 Павел_Шуков_talks48 20 stupich 14 kipovets 14 Лайош_Портиш 13 vijigau_mraz 13 наивная баба 12 genek77 12Ответ 4
В вашем случае будет выгоднее сделать группировку на стороне MySQL сервера, чтобы не тащить все данные с сервера: select name, cnt from ( select name, count(*) as cnt from tab group by name order by cnt desc ) as v limit 3; Тест на SQLFiddle и потом просто прочитать результат данного SQL в DataFrame Если делать это средствами Pandas: Тестовый набор случайных данных с неравномерным распределением: In [63]: df = pd.DataFrame({ ...: 'name':np.random.choice(['aaa','bbb','ccc', 'ddd', 'eee', 'fff'], 100, p=[0.4, .13, .15, .05, .2, .07]) ...: }) ...: ...: PS тот же набор данных я использовал для SQLFiddle... Выбираем top 3: In [69]: df['name'].value_counts().iloc[:3].reset_index(name='cnt').rename(columns={'index':'name'}) Out[69]: name cnt 0 aaa 45 1 eee 19 2 ccc 13
Комментариев нет:
Отправить комментарий