2016-05-24 3 views
2

таким образом я получил DataFrame, выполнив:Избавьтесь от лишних наклеек на панд DataFrames

dfgrp=df.groupby(['CCS_Category_ICD9','Gender'])['f0_'].sum() 
ndf=pd.DataFrame(dfgrp) 
ndf 
          f0_ 
CCS_Category_ICD9 Gender 
1      F 889 
         M 796 
         U 2 
2      F 32637 
         M 33345 
         U 34 

Где f0_ это сумма подсчетов по полу Все, что я действительно хочу, это просто один уровень dataframe похож на этот который я получил через

ndf=ndf.unstack(level=1) 
ndf 
        f0_ 
    Gender   F  M  U 
CCS_Category_ICD9   
1     889.0  796.0 2.0 
2     32637.0 33345.0 34.0 
3     2546.0 1812.0 NaN 
4     347284.0 213782.0 34.0 

Но то, что я хочу это:

CCS_Category_ICD9 F   M   U  
1     889.0  796.0 2.0 
2     32637.0 33345.0 34.0 
3     2546.0 1812.0 NaN 
4     347284.0 213782.0 34.0 

Я не могу понять, хо w, чтобы сгладить или избавиться от уровней, связанных с f0_ и Gender. Все, что мне нужно, это заголовки столбцов «M», «F», «U», поэтому у меня есть простой один уровень данных. Я попытался reset_index и set_index вместе с несколькими другими вариациями, не повезло ...

В конце концов, я хочу иметь простую перекрестную таблицу с строк и столбцов сумм (которые мой пример не показывает ..

хорошо я сделал (как это было предложено в одном ответе):

ndf = ndf.f0_.unstack() 
ndf 

Который дал мне:

Gender F  M   U 
CCS_Category_ICD9   
1 889.0  796.0  2.0 
2 32637.0 33345.0 34.0 
3 2546.0 1812.0 NaN 
4 347284.0 213782.0 34.0 

Далее следуют:

nndf=ndf.reset_index(['CCS_Category_ICD9','F','M','U']) 
nndf 
Gender CCS_Category_ICD9 F  M   U 
    0  1    889.0 796.0  2.0 
    1  2    32637.0 33345.0 34.0 
    2  3    2546.0 1812.0 NaN 
    3  4    347284.0 213782.0 34.0 
    4  5    3493.0 7964.0 1.0 
    5  6    12295.0 9998.0 4.0 

Что именно это делает, но я не могу изменить имя индекса из «Пол» на что-то вроде Idx, независимо от того, что я делаю. Я получаю дополнительную строку, добавленную с помощью нового имени, т.е. строки под названием Idx, только в разделе «Пол». Также есть ли более прямое решение?

ответ

0

Вы можете

df.loc[:, 'f0_'] 

для DataFrame в результате .unstack(), то есть, выберите первый уровень ваших MultiIndex колонн, которые только оставляет gender уровень, или в качестве альтернативы

df.columns = df.columns.droplevel() 

см MultiIndex.dropleveldocs

+0

изменил вопрос, чтобы показать результаты 1 ответ, не смог получить хороший результат с твоим .. – dartdog

0

Потому что ndf - это pd.DataFrame имеет индекс столбца. Когда вы выполнили unstack(), он добавляет последний уровень из индекса строки в индекс столбца. Поскольку столбцы уже имели f0_, вы получили второй уровень. Чтобы сгладить способ, который вы хотите, вызовите unstack() вместо столбца.

ndf = ndf.f0_.unstack() 

Текст Gender это имя индекса столбца. Если вы хотите избавиться от него, вам придется перезаписать атрибут name для этого объекта.

ndf.columns.name = None 

Используйте это сразу после ndf.f0_.unstack()

+0

Я пробовал ваш ответ и добавил результат к вопросу? – dartdog

0

Как правило, используют df.pivot, когда вы хотите использовать столбец как индекс строки и другой столбец как индекс столбца. Используйте df.pivot_table, когда вам нужно агрегировать значения из-за строк с двойными (строка, столбец).

В этом случае вместо df.groupby(...)[...].sum().unstack() вы могли бы использовать df.pivot_table:

import numpy as np 
import pandas as pd 
N = 100 
df = pd.DataFrame({'CCS': np.random.choice([1,2], size=N), 
        'Gender':np.random.choice(['F','M','U'], size=N), 
        'f0':np.random.randint(10, size=N)}) 
result = df.pivot_table(index='CCS', columns='Gender', values='f0', aggfunc='sum') 
result.columns.name = None 
result = result.reset_index() 

дает

CCS F M U 
0 1 89 104 90 
1 2 66 65 65 

Обратите внимание, что после вызова pivot_table(), то DataFrame result имеет имени в Декс и колонка Indexes:

In [176]: result = df.pivot_table(index='CCS', columns='Gender', values='f0', aggfunc='sum'); result 
Out[176]: 
Gender F M U 
CCS     
1  89 104 90 
2  66 65 65 

Индекс называется CSS:

In [177]: result.index 
Out[177]: Int64Index([1, 2], dtype='int64', name='CCS') 

и столбцы индекса называется Gender:

In [178]: result.columns 
Out[178]: Index(['F', 'M', 'U'], dtype='object', name='Gender') # <-- notice the name='Gender' 

Чтобы удалить имя из Index, назначить None к атрибуту name:

In [179]: result.columns.name = None 

In [180]: result 
Out[180]: 
     F M U 
CCS    
1 95 68 67 
2 82 63 68 

Хотя это здесь не требуется, чтобы удалить имена из уровней мультииндексных, назначить список None с к (множественное число) атрибута names:

result.columns.names = [None]*numlevels 
Смежные вопросы