2016-12-27 61 views
2

我有以下数据框:如何过滤掉,并通过排组条目值

df = 
ID GROUP_1 GROUP_2 GROUP_3 GRADE 
1A AAA  BBB  AAA  5 
1B BBB  BBB  CCC  4 
1C AAA  BBB  BBB  4 

我想指望有傲人的成绩54,行数..,1GROUP每个唯一值。请注意,在第一行中,有两次出现AAA,但是我算了一次。

对于给定数据集的预期输出如下:

GROUP GRADE_1 GRADE_2 GRADE_3 GRADE_4 GRADE_5 
AAA 0   0   0   1   1 
BBB 0   0   0   2   1 
CCC 0   0   0   1   0 

我有低于给定的代码,它工作正常,但不包括分组(groupby('GRADE'))。我不知道如何按GRADE对结果进行分组,并创建列GRADE_1GRADE_2,...,GRADE_5

df.groupby('GRADE').filter(regex="^GROUP").stack().reset_index(level=1, drop=True).reset_index().drop_duplicates()[0].value_counts() 

回答

2

试试这个:

In [56]: df 
Out[56]: 
    ID GROUP_1 GROUP_2 GROUP_3 GRADE 
0 1A  AAA  BBB  AAA  5 
1 1B  BBB  BBB  CCC  4 
2 1C  AAA  BBB  BBB  4 

In [57]: (df.set_index('GRADE') 
    ...: .filter(like='GROUP_') 
    ...: .stack() 
    ...: .to_frame('GROUP') 
    ...: .reset_index() 
    ...: .pivot_table(index='GROUP', columns='GRADE', aggfunc='size', fill_value=0) 
    ...:) 
    ...: 
Out[57]: 
GRADE 4 5 
GROUP 
AAA 1 2 
BBB 4 1 
CCC 1 0 
0

你可以先创建含真/假每个年级列如下:

for grade in df.GRADE.unique(): 
    col = 'GRADE_{}'.format(grade) 
    df[col] = df.GRADE.apply(lambda x: x == grade) 
1

Beause MaxU的回答是太美好了。我不得不努力工作来贡献一些有用的东西。如果不那么直观,该解决方案就意味着快速(er)。

groups_df = df.filter(like='GROUP') 
groups = groups_df.values.ravel().tolist() 
grades = df.GRADE.values.repeat(len(groups_df.columns)).tolist() 
s = pd.value_counts(list(zip(groups, grades))) 
s.index = pd.MultiIndex.from_tuples(
    s.index.values.tolist(), names=['Group', 'GRADE']) 

s.unstack(fill_value=0) 

GRADE 4 5 
Group  
AAA 1 2 
BBB 4 1 
CCC 1 0