Как применить к одному набору столбцов в кадре данных с многоиндексными столбцами - PullRequest
2 голосов
/ 06 апреля 2019

У меня есть фрейм данных с многоиндексным столбцом, как вы видите ниже, и я пытаюсь сделать это для каждого пользователя, а также для m1 и m2, мне нужно получить значение для сегодняшнего дня + 0,25 * значение для вчерашнего дня.

               m1              m2  
day           yesterday today yesterday today
user                                      
id1           5         6     7         8
id2           3         4     9         10

Я пробовал следующее, но я получаю значения NA во всех столбцах "сегодня":

df.iloc[:, df.columns.get_level_values(1)=='today'] = 
df.iloc[:, df.columns.get_level_values(1)=='yesterday'] *0.25 +
 df.iloc[:, df.columns.get_level_values(1)=='today']

Мой поиск по другим сообщениям stackoverflow привел меня к возможному ответу группировки поуровень = 0, но я не знаю, как оттуда и как применить функцию к результату группы по.Или, может быть, это неправильный подход к этому?

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

Во-первых, мне нужно добраться до:

               m1                      m2  
day           yesterday today          yesterday today
user                                      
id1               5     6+0.25*5       7         8+0.25*7
id2               3     4+0.25*3       9         10+0.25*9

В конечном счете, мне нужно добраться до:


user           m1              m2             
id1            6+0.25*5        8+0.25*7
id2            4+0.25*3        10+0.25*9

ps я впервые задаю вопрос о StackOverflow, я сделал все возможное!но, пожалуйста, дайте мне знать, если мне нужно изменить свой вопрос, чтобы следовать рекомендациям.Спасибо!

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Используйте DataFrame.xs для выбора, поэтому возможно добавить DataFrame s вместе с кратным по константе.

Преимущество функции убрано верхними уровнями (значение по умолчанию drop_level=True)- так работает без MultiIndex на выходе DataFrame с.

print (df.xs('today', axis=1, level=1))
     m1  m2
id1   6   8
id2   4  10

print (df.xs('yesterday', axis=1, level=1))
     m1  m2
id1   5   7
id2   3   9

df1 = df.xs('today', axis=1, level=1) + 0.25 *df.xs('yesterday', axis=1, level=1)
print (df1)
       m1     m2
id1  7.25   9.75
id2  4.75  12.25
0 голосов
/ 06 апреля 2019

Нашел его !!!

def func(df):
    df.columns = df.columns.droplevel()
    return(df['today']+0.25*df['yesterday'])

, а затем:

df.groupby(level=0, axis=1).apply(func)
...