Панды долго переходят в широкую форму

У меня есть данные в длинном формате и я пытаюсь переформатировать в широкие, но, похоже, нет простого способа сделать это, используя melt / stack / unstack:

Salesman Height product price Knut 6 bat 5 Knut 6 ball 1 Knut 6 wand 3 Steve 5 pen 2 

становится:

 Salesman Height product_1 price_1 product_2 price_2 product_3 price_3 Knut 6 bat 5 ball 1 wand 3 Steve 5 pen 2 NA NA NA NA 

Я думаю, Stata может сделать что-то подобное с командой reshape.

  • Несколько версий Python на OS X Leopard
  • Как издеваться над пользователями и запросами в django
  • Двоичный файл IO в python, с чего начать?
  • Как заставить ndarray показать обычным способом вместо научной нотации?
  • Выбор подходящего способа использования Neo4j в Python
  • Как найти все PDF-файлы на основе изображений?
  • Результаты двойного счета Postgres + Sqlalchemy
  • Django, разделение между двумя комментариями не будет правильно вычисляться
  • 5 Solutions collect form web for “Панды долго переходят в широкую форму”

    Простой стержень может быть достаточным для ваших нужд, но это то, что я сделал, чтобы воспроизвести желаемый результат:

     df['idx'] = df.groupby('Salesman').cumcount() 

    Просто добавление внутри группового счетчика / индекса даст вам большую часть пути, но метки столбцов не будут такими, какие вы хотели:

     print df.pivot(index='Salesman',columns='idx')[['product','price']] product price idx 0 1 2 0 1 2 Salesman Knut bat ball wand 5 1 3 Steve pen NaN NaN 2 NaN NaN 

    Чтобы приблизиться к вашему желаемому результату, я добавил следующее:

     df['prod_idx'] = 'product_' + df.idx.astype(str) df['prc_idx'] = 'price_' + df.idx.astype(str) product = df.pivot(index='Salesman',columns='prod_idx',values='product') prc = df.pivot(index='Salesman',columns='prc_idx',values='price') reshape = pd.concat([product,prc],axis=1) reshape['Height'] = df.set_index('Salesman')['Height'].drop_duplicates() print reshape product_0 product_1 product_2 price_0 price_1 price_2 Height Salesman Knut bat ball wand 5 1 3 6 Steve pen NaN NaN 2 NaN NaN 5 

    Изменить: если вы хотите обобщить процедуру на большее количество переменных, я думаю, вы могли бы сделать что-то вроде следующего (хотя это может быть недостаточно эффективно):

     df['idx'] = df.groupby('Salesman').cumcount() tmp = [] for var in ['product','price']: df['tmp_idx'] = var + '_' + df.idx.astype(str) tmp.append(df.pivot(index='Salesman',columns='tmp_idx',values=var)) reshape = pd.concat(tmp,axis=1) 

    @Luke сказал:

    Я думаю, Stata может сделать что-то подобное с командой reshape.

    Вы можете, но я думаю, вам также понадобится внутри группового счетчика, чтобы получить изменение в stata, чтобы получить желаемый результат:

      +-------------------------------------------+ | salesman idx height product price | |-------------------------------------------| 1. | Knut 0 6 bat 5 | 2. | Knut 1 6 ball 1 | 3. | Knut 2 6 wand 3 | 4. | Steve 0 5 pen 2 | +-------------------------------------------+ 

    Если вы добавите idx вы можете изменить форму в stata :

     reshape wide product price, i(salesman) j(idx) 

    Немного устарел, но я опубликую это для других людей.

    То, что вы хотите, может быть достигнуто, но вы, вероятно, не должны этого хотеть;) Pandas поддерживает иерархические индексы для строк и столбцов. В Python 2.7.x …

     from StringIO import StringIO raw = '''Salesman Height product price Knut 6 bat 5 Knut 6 ball 1 Knut 6 wand 3 Steve 5 pen 2''' dff = pd.read_csv(StringIO(raw), sep='\s+') print dff.set_index(['Salesman', 'Height', 'product']).unstack('product') 

    Создает, вероятно, более удобное представление, чем то, что вы искали

      price product ball bat pen wand Salesman Height Knut 6 1 5 NaN 3 Steve 5 NaN NaN 2 NaN 

    Преимущество использования set_index и отладки в сравнении с одной функцией в качестве сводной части состоит в том, что вы можете разбить операции на простые небольшие шаги, что упрощает отладку.

     pivoted = df.pivot('salesman', 'product', 'price') 

    стр. 192 Python для анализа данных

    Вот еще одно решение, более сложное, взятое из сайта Криса Альбона .

    Создание «длинного» кадра данных

     raw_data = {'patient': [1, 1, 1, 2, 2], 'obs': [1, 2, 3, 1, 2], 'treatment': [0, 1, 0, 1, 0], 'score': [6252, 24243, 2345, 2342, 23525]} df = pd.DataFrame(raw_data, columns = ['patient', 'obs', 'treatment', 'score']) 

    Сделайте «широкие» данные

     df.pivot(index='patient', columns='obs', values='score') 

    Переформатирование документов здесь

    Вы ищете pd.wide_to_long() (который является прямым аналогом команды stata)

    Interesting Posts

    фильтрация сгруппирована df в пандах

    Синтаксис – выделение Python в линии сгиба vim

    Неизвестное выражение python имя_файла = r '/ путь / в / файл'

    Python: найдите подстроку в строке и верните индекс подстроки

    Заменить элемент списком в python

    Почему мой Python 'sys.path' отличается для каждого инструмента, который я использую для запуска моего кода?

    использовать типы python для взаимодействия с nvapi (следить за демонстрационным кодом)

    time.strptime () – аргумент 0 должен быть str, а не байтами

    как удалить «пустое» пространство между подзаголовками?

    Могу ли я подавить переменное расширение в документации Sphinx?

    Python: анализ числовых значений из строки с использованием регулярных выражений

    Что такое глобальный шлюз интерпретатора (GIL)?

    Формат номера параметра Openpyxl

    Почему мой питон python становится неупорядоченным?

    Настройка цветной темы vim для выделенных фигурных скобок

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