Вычисление суммы строк в столбце, когда другие столбцы удовлетворяют критерию - PullRequest
1 голос
/ 27 января 2020

У меня есть фрейм данных, который выглядит следующим образом (если хотите, код внизу:

                A    B   C   D       E
Year Category                          
1980 Alpha     100  800  10  15  1.2350
     Bravo     200  700  20  25  2.3550
     Charlie   300  600  30  35  3.3600
     Delta     400  500  40  45  4.4448
1981 Alpha     500  400  50  55  5.5000
     Bravo     600  300  60  65  6.0000
     Charlie   700  200  70  75  7.2000
     Delta     800  100  80  85  8.0000

Для каждого года я пытаюсь получить сумму (и среднее значение) столбцов AD для всех строк, где значение E больше, чем медиана для этого года.

Таким образом, для 1980 года только Charl ie & Delta квалифицируются как имеющие значение в столбце E, которое больше чем Медиана для этого года. Следовательно, результат для столбца А должен быть ... сумма = 300 + 400 = 700 ... среднее = среднее (300, 400) = 350

Самое близкое, что я могу получить здесь, это использовать groupby / median

df.groupby(['Year']).median()

... но тогда я не совсем уверен, что делать с выходами. Это дает мне медианы для каждого года, но я не могу затем легко связать эти результаты с моим исходным кадром данных.

Код кадра данных:

data = {'A': [100,200,300,400,500,600,700,800], 
        'B': [800,700,600,500,400,300,200,100], 
        'C': [10,20,30,40,50,60,70,80], 
        'D': [15,25,35,45,55,65,75,85], 
        'E': [1.235,2.355,3.36,4.4448,5.5,6,7.2,8]}

idx = pd.MultiIndex.from_product([[1980, 1981],['Alpha','Bravo', 'Charlie','Delta']], names=['Year','Category'])
df = pd.DataFrame(data, index=idx, columns=['A', 'B', 'C', 'D', 'E'])

1 Ответ

0 голосов
/ 27 января 2020

IIU C, вы можете сделать groupby на первом уровне и преобразовать median в столбец E, затем сравнить и отбросить строки, где E превышает медиану, и сумму на уровне = 0:

s = df['E'].gt(df.groupby(level=0)['E'].transform('median'))
df.drop('E',1)[s].sum(level=0)

        A     B    C    D
Year                      
1980   700  1100   70   80
1981  1500   300  150  160

Для сложения среднего и суммы в ряд вы можете сделать то же самое с concat и add_suffix для идентификации:

s = df['E'].gt(df.groupby(level=0)['E'].transform('median'))
m = df.drop('E',1)[s]
pd.concat((m.sum(level=0).add_suffix('_sum'),m.mean(level=0).add_suffix('_avg')),axis=1)

      A_sum  B_sum  C_sum  D_sum  A_avg  B_avg  C_avg  D_avg
Year                                                        
1980    700   1100     70     80    350    550     35     40
1981   1500    300    150    160    750    150     75     80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...