在python中使用条件和新创建的列提取行

时间:2018-03-06 13:56:02

标签: python pandas

我有这样的数据

id  name  sub  marks
1    a     m    52
1    a     s    69
1    a     p    63
2    b     m    36
2    b     s    52
2    b     p    56
3    c     m    85
3    c     s    62
3    c     p    56

我想要包含id,name和new column results等列的输出表(如果所有主题中的标记都大于40则使用标准然后该学生通过)

id  name  result
1    a    pass
2    b    fail 
3    c    pass

我想在python中这样做。

3 个答案:

答案 0 :(得分:2)

marks创建一个布尔掩码,然后使用groupbyidname)+ all

import pandas as pd
df = pd.read_csv('file.csv')

v = df.assign(result=df.marks.gt(40))\
      .groupby(['id', 'name'])\
      .result\
      .all()\
      .reset_index()
v['result'] = np.where(v['result'], 'pass', 'fail')

v
   id name result
0   1    a   pass
1   2    b   fail
2   3    c   pass

答案 1 :(得分:1)

这是一种方式

In [127]: df.groupby(['id', 'name']).marks.agg(
             lambda x: 'pass' if x.ge(40).all() else 'fail'
            ).reset_index(name='result')
Out[127]:
   id name result
0   1    a   pass
1   2    b   fail
2   3    c   pass

另一种方式,灵感来自jpp的解决方案,使用replacemap

In [132]: df.groupby(['id', 'name']).marks.min().ge(40).replace(
           {True: 'pass', False: 'fail'}
          ).reset_index(name='result')
Out[132]:
   id name result
0   1    a   pass
1   2    b   fail
2   3    c   pass

答案 2 :(得分:0)

这是通过pandas的一种方式。请注意,您的标准等于40以上的最小标记。此算法在计算上更有效。

import pandas as pd

df = pd.read_csv('file.csv')

df = df.groupby(['id', 'name'])['marks'].apply(min).reset_index()
df['result'] = np.where(df['marks'] > 40, 'pass', 'fail')

df = df[['id', 'name', 'result']]

<强>结果

   id name result
0   1    a   pass
1   2    b   fail
2   3    c   pass

<强>解释

  • 首先按groupby.min()id执行name
  • 然后根据值为列指定字符串。