Python Pandas: как разбить отсортированный словарь в столбце кадра данных

У меня есть dataFrame, как это:

id asn orgs 0 3320 {'Deutsche Telekom AG': 2288} 1 47886 {'Joyent': 16, 'Equinix (Netherlands) BV': 7} 2 47601 {'fusion services': 1024, 'GCE Global Maritime':16859} 3 33438 {'Highwinds Network Group': 893} 

Я хотел бы отсортировать столбец «orgs», который на самом деле является словарем, а затем извлечь из него пару (k, v) с наивысшими значениями в двух разных столбцах. Как это:

 id asn org value 0 3320 'Deutsche Telekom AG' 2288 1 47886 'Joyent' 16 2 47601 'GCE Global Maritime' 16859 3 33438 'Highwinds Network Group' 893 

В настоящее время я запускаю этот код, но он неправильно сортируется, и тогда я не уверен, как извлечь пару с наивысшим значением.

 df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)) 

который дал мне такой список:

 id asn orgs 0 3320 [('Deutsche Telekom AG', 2288)] 1 47886 [('Joyent', 16),( 'Equinix (Netherlands) BV', 7)] 2 47601 [('GCE Global Maritime',16859),('fusion services', 1024)] 3 33438 [('Highwinds Network Group', 893)] 

Теперь, как я могу поместить ключ и значение самого высокого в два отдельных столбца? Может ли кто-нибудь помочь?

2 Solutions collect form web for “Python Pandas: как разбить отсортированный словарь в столбце кадра данных”

Другой подход определяет функцию, которая просто вызывает min на dict и возвращает серию, поэтому вы можете назначить несколько столбцов (тело функции взято из ответа @Alex Martelli ):

 In [17]: def func(x): k = min(x, key=x.get) return pd.Series([k, x[k]]) df[['orgs', 'value']] = df['orgs'].apply(func) df Out[17]: asn id orgs value 0 3320 0 Deutsche Telekom AG 2288 1 47886 1 Equinix (Netherlands) BV 7 2 47601 2 fusion services 1024 3 33438 3 Highwinds Network Group 893 

РЕДАКТИРОВАТЬ

Если ваши данные имеют пустые шрифты, вы можете просто проверить len :

 In [34]: df = pd.DataFrame({'id':[0,1,2,3,4], 'asn':[3320,47886,47601,33438,56], 'orgs':[{'Deutsche Telekom AG': 2288}, {'Joyent': 16, 'Equinix (Netherlands) BV': 7}, {'fusion services': 1024, 'GCE Global Maritime':16859}, {'Highwinds Network Group': 893},{}]}) df Out[34]: asn id orgs 0 3320 0 {'Deutsche Telekom AG': 2288} 1 47886 1 {'Equinix (Netherlands) BV': 7, 'Joyent': 16} 2 47601 2 {'GCE Global Maritime': 16859, 'fusion service... 3 33438 3 {'Highwinds Network Group': 893} 4 56 4 {} In [36]: def func(x): if len(x) > 0: k = min(x, key=x.get) return pd.Series([k, x[k]]) return pd.Series([np.NaN, np.NaN]) df[['orgs', 'value']] = df['orgs'].apply(func) df Out[36]: asn id orgs value 0 3320 0 Deutsche Telekom AG 2288 1 47886 1 Equinix (Netherlands) BV 7 2 47601 2 fusion services 1024 3 33438 3 Highwinds Network Group 893 4 56 4 NaN NaN 

Это должно работать:

 In [1]: import pandas as pd In [2]: import operator In [3]: df = pd.DataFrame({ 'id' : [0,1,2,3], ...: 'asn' : [3320, 47886, 47601, 33438], ...: 'orgs' : [{'Deutsche Telekom AG': 2288}, {'Joyent': 16, 'Equinix (Netherlands) BV': 7}, {'fusion services': 1024, 'GCE Global Maritime':16859}, {'Highwinds Network Group': 893}] ...: }) In [4]: df.orgs, df['value'] = zip(*df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)[0])) In [5]: df Out[5]: asn id orgs value 0 3320 0 Deutsche Telekom AG 2288 1 47886 1 Joyent 16 2 47601 2 GCE Global Maritime 16859 3 33438 3 Highwinds Network Group 893 

Я использовал zip(* <first element of sorted dict items>) и назначил их df.orgs и df.value .

Для пустых словарей:

 In [3]: df = pd.DataFrame({ 'id' : [0,1,2,3], ...: 'asn' : [3320, 47886, 47601, 33438], ...: 'orgs' : [{'Deutsche Telekom AG': 2288}, {'Joyent': 16, 'Equinix (Netherlands) BV': 7}, {'fusion services': 1024, 'GCE Global Maritime':16859}, {}] ...: }) In [4]: df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)[0] if len(x) else ('','')) Out[4]: 0 (Deutsche Telekom AG, 2288) 1 (Joyent, 16) 2 (GCE Global Maritime, 16859) 3 (, ) Name: orgs, dtype: object In [5]: df.orgs, df['value'] = zip(*df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)[0] if len(x) else ('',''))) In [6]: df Out[6]: asn id orgs value 0 3320 0 Deutsche Telekom AG 2288 1 47886 1 Joyent 16 2 47601 2 GCE Global Maritime 16859 3 33438 3 
  • Pandas groupby с dict
  • Сгладить столбец со значением списка типов при одновременном дублировании значения другого столбца в Pandas
  • Объединение двух серий в DataFrame в пандах
  • добавление строки в DataFrame / Series MultiIndex
  • Добавить строку в начало каждого значения в указанном столбце фрейма данных pandas (элегантно)
  • Как эффективно применять pos_tag_sents () к файловому кадру pandas
  • Используйте numpy.average с весами для передискретизации массива pandas
  • Как отсортировать Временной ряд Pandas, содержащий значения в 12-часовом формате (AM / PM)
  •  
    Interesting Posts for Van-Lav

    Matplotlib – отобразить график движения, а затем вернуться к основному коду

    Передача объекта C ++ на C ++-код через Python?

    Как написать файл конфигурации pep8 (pep8.rc)?

    Как получить информацию обо всех мониторах с Python в Windows?

    Как отсортировать DataFrame Pandas в соответствии с несколькими критериями?

    Как сделать пользовательский объект итерабельным?

    Как установить значение с помощью Beautiful Soup в каком-либо элементе HTML, если я знаю id этого элемента или класса?

    Python: условные переменные, основанные на запуске nosetest

    Я уже установил libpng, но есть ошибка «« png.h »file not found #include <png.h>», когда я устанавливаю автозапуск

    Сигналы Django для новой записи

    Где я могу поместить свои самописные пакеты Python?

    itertools.takewhile в функции генератора – почему он оценивается только один раз?

    p.stdout.read () не работает в моих кодах Python 3

    Изображение.show () не отображает изображение

    Вы используете «глобальный» оператор в Python?

    Python - лучший язык программирования в мире.