这里有一种方法可以做到这一点。
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)
非常感谢。很有帮助。 – user4979733