Сортировка и размещение списка с использованием панд

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

Я пробовал использовать метод sort (), но он показывает, что «список не имеет сортировки атрибутов». Пожалуйста, предложите решение, а также предложите, не требуется ли каких-либо изменений.

Входной файл:

3=1388|4=1388|5=IBM|8=157.75|9=88929|1021=1500|854=n|388=157.75|394=157.75|474=157.75|1584=88929|444=20160713|459=93000546718000|461=7|55=93000552181000|22=89020|400=157.75|361=0.73|981=0|16=1468416600.6006|18=1468416600.6006|362=0.46 3=1388|4=1388|5=IBM|8=157.73|9=100|1021=0|854=p|394=157.73|474=157.749977558|1584=89029|444=20160713|459=93001362639104|461=26142|55=93001362849000|22=89120|361=0.71|981=0|16=1468416601.372|18=1468416601.372|362=0.45 3=1388|4=1388|5=IBM|8=157.69|9=100|1021=600|854=p|394=157.69|474=157.749910415|1584=89129|444=20160713|459=93004178882560|461=27052|55=93004179085000|22=89328|361=0.67|981=1|16=1468416604.1916|18=1468416604.1916|362=0.43 

Код, который я пробовал:

 import pandas as pd import numpy as np df = pd.read_csv('inputfile', index_col=None, names=['text']) s = df.text.str.split('|') ds = [dict(w.split('=', 1) for w in x) for x in s] p = pd.DataFrame.from_records(ds) p1 = p.replace(np.nan,'n/a', regex=True) st = p1.stack(level=0,dropna=False) dfs = [g for i,g in st.groupby(level=0)] #print st i = 0 while i < len(dfs): #index of each column print ('\nindex[%d]'%i) for (_,k),v in dfs[i].iteritems(): print k,'\t',v i = i + 1 

выход:

 index[0] 1021 1500 1584 88929 16 1468416600.6006 18 1468416600.6006 22 89020 3 1388 361 0.73 362 0.46 388 157.75 394 157.75 4 1388 400 157.75 444 20160713 459 93000546718000 461 7 474 157.75 5 IBM 55 93000552181000 8 157.75 854 n 9 88929 981 0 index[1] 1021 0 1584 89029 16 1468416601.372 18 1468416601.372 22 89120 3 1388 361 0.71 362 0.45 388 n/a 394 157.73 4 1388 400 n/a 444 20160713 459 93001362639104 461 26142 474 157.749977558 5 IBM 55 93001362849000 8 157.73 854 p 9 100 981 0 

Ожидаемый результат:

 index[0] 3 1388 4 1388 5 IBM 8 157.75 9 88929 16 1468416600.6006 18 1468416600.6006 22 89020 55 93000552181000 361 0.73 362 0.46 388 157.75 394 157.75 400 157.75 444 20160713 459 93000546718000 461 7 474 157.75 854 n 981 0 1021 1500 1584 88929 index[1] 3 1388 4 1388 5 IBM 8 157.75 9 88929 16 1468416600.6006 18 1468416600.6006 22 89020 55 93000552181000 361 0.73 362 0.46 394 157.75 444 20160713 459 93000546718000 461 7 474 157.75 854 n 981 0 1021 1500 1584 88929 388 n/a 400 n/a 

2 Solutions collect form web for “Сортировка и размещение списка с использованием панд”

Замените линию ds на

 ds = [{int(pair[0]): pair[1] for pair in [w.split('=', 1) for w in x]} for x in s] 

Чтобы преобразовать индекс в целое число, поэтому оно будет отсортировано численно

Чтобы вывести значения n / a в конце, вы можете использовать выбор pandas для вывода значений nonnull сначала, а затем нулевые значения, например:

 for (ix, series) in p.iterrows(): print('\nindex[%d]' % ix) output_series(ix, series[pd.notnull]) output_series(ix, series[pd.isnull].fillna('n/a')) 

Кстати, вы также можете упростить свой стек, groupby, print to:

 for (ix, series) in p1.iterrows(): print('\nindex[%d]' % ix) for tag, value in series.iteritems(): print(tag, '\t', value) 

Таким образом, весь скрипт становится:

 def output_series(ix, series): for tag, value in series.iteritems(): print(tag, '\t', value) df = pd.read_csv('inputfile', index_col=None, names=['text']) s = df.text.str.split('|') ds = [{int(pair[0]): pair[1] for pair in [w.split('=', 1) for w in x]} for x in s] p = pd.DataFrame.from_records(ds) for (ix, series) in p.iterrows(): print('\nindex[%d]' % ix) output_series(ix, series[pd.notnull]) output_series(ix, series[pd.isnull].fillna('n/a')) 

Вот:

 import pandas as pd import numpy as np df = pd.read_csv('inputfile', index_col=None, names=['text']) s = df.text.str.split('|') ds = [dict(w.split('=', 1) for w in x) for x in s] p1 = pd.DataFrame.from_records(ds).fillna('n/a') st = p1.stack(level=0,dropna=False) for k, v in st.groupby(level=0): print(k, v.sort_index()) 
  • Как вы разбиваете список на куски с равномерным размером?
  • Python: разделите строковое поле на 3 отдельных поля, используя Lambda
  • Разделение значений из CSV Reader Python
  • re.split return Нет в функции, но нормально работает нормально
  • Разбиение списков на короткие номера
  • Разделенная строка Python на основе регулярного выражения
  • разделить строку на группы заданного размера
  • Pandas: разделение кадра данных на несколько кадров данных по количеству строк
  • Сплит RSS RSS-строка с использованием Python
  • Ошибка атрибута: объект «list» не имеет атрибута «split»
  • pandas разделяет строку на столбцы
  •  
    Interesting Posts for Van-Lav

    Есть ли константа Python для Unicode-пробелов?

    Почему такое понимание списков происходит быстрее?

    Маркировка POS – NLTK считает существительное прилагательным

    Найти несколько максимальных значений в массиве 2d быстро

    Компилятор Python для простого языка для java vm code algorithm

    Проверка поля формы Django и проверка подлинности аутентификации

    Есть ли инструмент для наложения Python на основе руководства по стилю Google?

    как определить имя файла, загруженного с помощью HTTP в Python?

    Какую технологию шаблонов я должен использовать с CherryPy?

    python – нет лучшего способа получить выражение в функции отладки

    Как получить размер терминала или размер шрифта в пикселях?

    Python Flask: отслеживание пользовательских сеансов? Как получить идентификатор сеанса cookie?

    Создание массива numpy объектов пользовательского класса с C API

    Простая в использовании библиотека шифрования Python / обертка?

    Python – для регистратора «OpenGL.error» не найдено обработчиков

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