Невозможно добавить столбец с помощью pandas groupby.apply - PullRequest
0 голосов
/ 09 ноября 2018

Изначально у меня есть следующая таблица:

df=pd.DataFrame(
    np.arange(4*8).reshape(4,8),
    index=list('abcd'),
    columns=pd.MultiIndex.from_arrays([list('EEEETTTT'), list('XXYYZZWW'), list('rsrsrsrs')] )
)

    E               T            
    X       Y       Z       W    
    r   s   r   s   r   s   r   s
a   0   1   2   3   4   5   6   7
b   8   9  10  11  12  13  14  15
c  16  17  18  19  20  21  22  23
d  24  25  26  27  28  29  30  31

Я добавляю новый столбец с именем 'V' рядом с ( , ,'s') многоиндексным столбцом следующим образом:

    E                     T                  
    X          Y          W          Z       
    r   s  V   r   s  V   r   s  V   r   s  V
a   0   1  0   2   3  0   6   7  0   4   5  0
b   8   9  0  10  11  0  14  15  0  12  13  0
c  16  17  0  18  19  0  22  23  0  20  21  0
d  24  25  0  26  27  0  30  31  0  28  29  0

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

dfl=[]
for name, x in df.groupby(level=[0, 1], axis=1):
    index = pd.IndexSlice
    x.loc[:,index[name[0],name[1],'V']]= 0
    dfl.append(x)

pd.concat(dfl, axis=1) 

Теперь я попробовал следующий «альтернативный» способ получить тот же результат:

def f(x):
    idx = pd.IndexSlice
    x.loc[:, idx[x.name[0], x.name[1], 'V']]=0
    return x

df.groupby(level=[0,1], axis=1).apply(f)

Однако, к моему удивлению, итоговая таблица остается неизменной:

    E               T            
    X       Y       Z       W    
    r   s   r   s   r   s   r   s
a   0   1   2   3   4   5   6   7
b   8   9  10  11  12  13  14  15
c  16  17  18  19  20  21  22  23
d  24  25  26  27  28  29  30  31

pandas groupby.appy (func) должен позволять функции возвращать фрейм данных любого размера или даже скаляр.

Может ли это быть ошибкой?

1 Ответ

0 голосов
/ 09 ноября 2018

Это частичная ошибка , связанная с группировкой по MutiIndex in columns.

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

Ваше решение модифицировано транспонированием для MultiIndex in index, примените функцию и транспонируйте обратно:

def f(x):
    idx = pd.IndexSlice
    x.loc[idx[x.name[0], x.name[1], 'V'], :]=0
    x.index = x.index.droplevel([0,1])
    return x

df = df.T.groupby(level=[0,1], axis=0).apply(f).T.astype(int)
print (df)
    E                     T                  
    X          Y          W          Z       
    r   s  V   r   s  V   r   s  V   r   s  V
a   0   1  0   2   3  0   6   7  0   4   5  0
b   8   9  0  10  11  0  14  15  0  12  13  0
c  16  17  0  18  19  0  22  23  0  20  21  0
d  24  25  0  26  27  0  30  31  0  28  29  0

def f(x):
    idx = pd.IndexSlice
    x.loc[idx[x.name[0], x.name[1], 'V'], :]=0
    return x

df = df.T.groupby(level=[0,1], axis=0).apply(f).T.astype(int)
print (df)
    E                     T                  
    X          Y          W          Z       
    E          E          T          T       
    X          Y          W          Z       
    r   s  V   r   s  V   r   s  V   r   s  V
a   0   1  0   2   3  0   6   7  0   4   5  0
b   8   9  0  10  11  0  14  15  0  12  13  0
c  16  17  0  18  19  0  22  23  0  20  21  0
d  24  25  0  26  27  0  30  31  0  28  29  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...