pandas – pivot_table с нечисловыми значениями? (DataError: нет числовых типов для агрегирования)

Я пытаюсь сделать стержень таблицы, содержащей строки в качестве результатов.

import pandas as pd df1 = pd.DataFrame({'index' : range(8), 'variable1' : ["A","A","B","B","A","B","B","A"], 'variable2' : ["a","b","a","b","a","b","a","b"], 'variable3' : ["x","x","x","y","y","y","x","y"], 'result': ["on","off","off","on","on","off","off","on"]}) df1.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

Но я получаю: DataError: No numeric types to aggregate .

Это работает по назначению, когда я меняю значения результата на числа:

 df2 = pd.DataFrame({'index' : range(8), 'variable1' : ["A","A","B","B","A","B","B","A"], 'variable2' : ["a","b","a","b","a","b","a","b"], 'variable3' : ["x","x","x","y","y","y","x","y"], 'result': [1,0,0,1,1,0,0,1]}) df2.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

И я получаю то, что мне нужно:

 variable1 AB variable2 abab variable3 xyxyxy index 0 1 NaN NaN NaN NaN NaN 1 NaN NaN 0 NaN NaN NaN 2 NaN NaN NaN NaN 0 NaN 3 NaN NaN NaN NaN NaN 1 4 NaN 1 NaN NaN NaN NaN 5 NaN NaN NaN NaN NaN 0 6 NaN NaN NaN NaN 0 NaN 7 NaN NaN NaN 1 NaN NaN 

Я знаю, что могу сопоставить строки с численными значениями, а затем отменить операцию, но, может быть, есть более элегантное решение?

2 Solutions collect form web for “pandas – pivot_table с нечисловыми значениями? (DataError: нет числовых типов для агрегирования)”

Мой первоначальный ответ был основан на Pandas 0.14.1, и с тех пор многое изменилось в функции pivot_table (rows -> index, cols -> columns …)

Кроме того, похоже, что исходный трюк лямбда, который я опубликовал, больше не работает в Pandas 0.18. Вы должны обеспечить функцию уменьшения (даже если она минимальная, максимальная или средняя). Но даже это казалось неправильным – потому что мы не уменьшаем набор данных, просто трансформируем его … Таким образом, я больше смотрел на неустойчивость …

 import pandas as pd df1 = pd.DataFrame({'index' : range(8), 'variable1' : ["A","A","B","B","A","B","B","A"], 'variable2' : ["a","b","a","b","a","b","a","b"], 'variable3' : ["x","x","x","y","y","y","x","y"], 'result': ["on","off","off","on","on","off","off","on"]}) # these are the columns to end up in the multi-index columns. unstack_cols = ['variable1', 'variable2', 'variable3'] 

Во-первых, установите индекс данных, используя индекс + столбцы, которые вы хотите уложить, затем вызовите unstack с помощью arg уровня.

 df1.set_index(['index'] + unstack_cols).unstack(level=unstack_cols) 

Результирующий кадр данных ниже.

введите описание изображения здесь

Я считаю, что лучшим компромиссом является замена вкл / выкл True / False, что позволит пандам лучше «понимать» данные и действовать разумным, ожидаемым образом.

 df2 = df1.replace({'on': True, 'off': False}) 

Вы по существу уступили это в своем вопросе. Мой ответ: я не думаю, что есть лучший способ, и вы должны заменить 'on' / 'off' в любом случае на все, что будет дальше.

Как отмечает Энди Хейден в комментариях, вы получите лучшую производительность, если вы замените вкл / выкл 1/0.

  • Как отсортировать pandas pivot_table на основе новейшей даты на уровне?
  • Таблицы строк Pandas Pivot
  • pandas, поворачивающий блок данных, повторяющиеся строки
  • Python - лучший язык программирования в мире.