2015-06-16 3 views
0

Рассмотрим dataframe:панды: суммируя по несколько столбцов

STUDENT T_1 T_2 T_3 T_4 
0 A   PASS FAIL PASS FAIL 
1 B   PASS FAIL FAIL FAIL 
2 C   FAIL FAIL PASS PASS 
3 D   PASS FAIL PASS PASS 

Колонки Т_1 -> T_4 представляют тесты. В этом случае T_1 и T_3 являются испытаниями типа «X», а T_2 и T_4 являются испытаниями типа «Y». Столбцы являются категориальными. Я хочу получить распределение% на тип теста (т. Е. X/Y). Так что я хочу это:

STATUS X    Y 
0 PASS 0.75 (6/8) 0.25 (2/8) 
1 FAIL 0.25 (2/8) 0.75 (6/8) 

Я знаю, что могу использовать s.value_counts()/s.count() на серии, чтобы получить распределение% состояния для каждого столбца, но как агрегировать на несколько столбцов (т.е. , комбинируйте T_1/T_3, T_2/T_4, так как я знаю, что они принадлежат к определенному типу теста)

ответ

1

Вот один из способов сделать это.

import pandas as pd 
import numpy as np 

# just try to simulate your data 
student_id = np.array('A B C D E F G H I G'.split()).reshape(10, 1) 
test_results = np.random.choice(['PASS', 'FAIL'], size=(10, 4), p=[0.7, 0.3]) 
data = np.concatenate([student_id, test_results], axis=1) 
df = pd.DataFrame(data, columns=['STUDENT', 'T_1', 'T_2', 'T_3', 'T_4']) 

# set index as student names 
df.set_index('STUDENT', inplace=True) 
# add multi-level index to columns 
df.columns = pd.MultiIndex.from_tuples([('T_1', 'X'), ('T_2', 'Y'), ('T_3', 'X'), ('T_4', 'Y')]) 
# transpose the df, groupby X,Y 
by = df.T.groupby(level=1) 


def count_func(group): 
    num_pass = (group.values == 'PASS').sum() 
    num_fail = (group.values == 'FAIL').sum() 
    pass_rate = '{:>3.2f}% ({}/{})'.format(num_pass/(num_pass + num_fail), num_pass, num_pass + num_fail) 
    fail_rate = '{:>3.2f}% ({}/{})'.format(num_fail/(num_pass + num_fail), num_fail, num_pass + num_fail) 

    return pd.Series({'PASS RATE': pass_rate, 'FAIL_RATE': fail_rate}) 


result = by.apply(count_func) 

Out[5]: 
     FAIL_RATE  PASS RATE 
X 0.25% (5/20) 0.75% (15/20) 
Y 0.25% (5/20) 0.75% (15/20) 
+0

Большое спасибо. Очень полезно. – user4979733

Смежные вопросы