比较ID的相同列行,并将行减少到所需输出

ma8fv8wu  于 2022-09-21  发布在  其他
关注(0)|答案(3)|浏览(160)

我有一个这样的 Dataframe
学生号|Subject|SID|结果
-|-|
101|英语|1|通过
101|英语|1|通过
101|数学|3|及格
101|数学|3|及格
101|数学|33|失败
101|数学|33|失败
|102|英语|1|通过
|102|英语|1|通过
|102|数学|3|失败
|102|数学|3|失败

我想要这样的输出

SUBJECT|SID|PASS|FAIL|FAILED_STUMENT_ID
-|
英文|1|2|0|
数学|3|1|1|102
数学|33|0|1|101

我有一个很大的数据集,我想要获得关于主体和主体ID的结果,关于有多少人通过和失败。

我如何用PYTHON编写来获得这种 Dataframe ?

kx5bkwkv

kx5bkwkv1#

您可以使用pivot_tablelen的aggfunc来获取PassFailreset_index的计数

df = df.drop_duplicates(ignore_index=True)
df = (df.drop('Student ID', axis=1).
    pivot_table(index=['Subject', 'SID'],
               columns='Result',
               aggfunc=len,
               fill_value=0).
    rename_axis('', axis=1).
    reset_index()
     )
df['Total Students'] = df['Pass'] + df['Fail']

打印(Df):

Subject  SID  Fail  Pass  Total Students
0      English    1     0     2               2
1  Mathematics    3     1     1               2
2  Mathematics   33     1     0               1

学生号失败

如果您需要失败的学生ID,您需要做得更多-使用list aggfunc在PIVOT_TABLE中包括‘Student ID’,并对列进行一些重新排列:

df = (df.
    pivot_table(index=['Subject', 'SID'],
               columns=['Result'],
               values=['Student ID'],
               aggfunc={'Result':len,'Student ID':list},
               fill_value=0)
     )
df.columns = df.columns.to_flat_index()
df = df.drop(('Student ID', 'Pass'),axis=1)
df.columns = ['Fail', 'Pass', 'Failed_Student_ID']
df = df.reset_index()

打印(Df):

Subject  SID  Fail  Pass Failed_Student_ID
0      English    1     0     2                 0
1  Mathematics    3     1     1             [102]
2  Mathematics   33     1     0             [101]
gzjq41n4

gzjq41n42#

您可以使用函数GET_DUMMIES并按“学生ID”和“主题”列分组,如下所示:

marks = pd.DataFrame({
    'student':   ['100','100', '101'],
    'subject': ['math', 'math', 'math'],
    'result': ['pass', 'pass', 'failed']
})
marks[['failed','pass']] = pd.get_dummies(marks.result)
marks.groupby(['student','subject']).sum()
kr98yfug

kr98yfug3#

您可以删除 Dataframe 中的所有重复项,然后使用Groupby计算每个主题的通过和失败的值。

result = df.drop_duplicates().groupby(['Subject','SID'])['Result'].value_counts().unstack(fill_value=0).reset_index()

Result      Subject  SID  Fail  Pass
0           English    1     0     2
1       Mathematics    3     1     1
2       Mathematics   33     1     0

result['Total student'] = result[['Fail','Pass']].sum(axis=1)

相关问题